文档介绍:该【用Swagger测试接口,怎么在请求头中携带Token】是由【鼠标】上传分享,文档一共【12】页,该文档可以免费在线阅读,需要了解更多关于【用Swagger测试接口,怎么在请求头中携带Token】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。 : .
⽤Swagger测试接⼝,怎么在请求头中携带Token?
来⾃⼀个⼩伙伴在微信上的提问:
image
看到这个问题,松哥忽然想到我⾃⼰之前写过 Spring Boot+Swagger 的⽤法:
SpringBoot 整合 Swagger2
也写过 OAuth2 + Jwt 的⽤法:
想让 OAuth2 和 JWT 在⼀起愉快玩耍?请看松哥的表演
但是还没有将这两个结合在⼀起写过,所以⼩伙伴们对此有了疑问,想⼀想这还是⼀个⾮常常见的问题,因为现在使⽤令牌登录的场景越来越多,
在这种情况下,如果使⽤ Swagger 来测试接⼝,要怎么在请求头中携带 Token 呢?今天松哥就来和⼤家聊⼀聊。
⽬规划
如果⼩伙伴们没有看过松哥之前发的 OAuth2 系列⽂章,建议⼀定先看下(公众号江南⼀点⾬后台回复 OAuth2 获取),再来看本⽂内容,否
则接下来的内容可能会犯迷糊。
这⾥松哥搭建⼀个 OAuth2+JWT 的环境来做演⽰。⼀共搭建两个服务:
服务名 端⼝ 备注
auth-server 8080 授权服务器
user-server 8081 资源服务器
我稍微解释⼀下:
auth-server 就是我的资源服务器,⽤来颁发 JWT 令牌。
user-server 则是资源服务器,访问 user-server 上的资源,都需要携带令牌才能访问。
swagger 则⽤来给 user-server 上的接⼝⽣成⽂档。
OK,这是我们项⽬的⼀个⼤致规划。
Warning : .
接下来我们来搭建 OAuth2 测试环境。
授权服务器搭建
⾸先我们搭建⼀个名为 auth-server 的授权服务,搭建的时候,选择如下三个依赖:
Web
Spring Cloud Security
Spirng Cloud OAuth2
image
项⽬创建完成后,⾸先提供⼀个 Spring Security 的基本配置: : .
***@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
***@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
***@Override
***@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return ();
}
***@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
()
.withUser("sang")
.password(passwordEncoder().encode("123"))
.roles("admin")
.and()
.withUser("javaboy")
.password(passwordEncoder().encode("123"))
.roles("user");
}
***@Override
protected void configure(HttpSecurity http) throws Exception {
().disable().formLogin();
}
}
在这段代码中,为了代码简洁,我就不把 Spring Security ⽤户存到数据库中去了,直接存在内存中。
这⾥我创建了⼀个名为 sang 的⽤户,密码是 123,⾓⾊是 admin。同时我还配置了⼀个表单登录。
这段配置的⽬的,实际上就是配置⽤户。例如你想⽤微信登录第三⽅⽹站,在这个过程中,你得先登录微信,登录微信就要你的⽤户名/密码信
息,那么我们在这⾥配置的,其实就是⽤户的⽤户名/密码/⾓⾊信息。
需要注意的是,在当前案例中,我将采⽤ OAuth2 中的 password 模式进⾏登录,因此这⾥还需要明确的提供⼀个 AuthenticationManager
的 Bean。
基本的⽤户信息配置完成后,接下来我们来配置授权服务器。
⾸先来配置 TokenStore:
***@Configuration
public class AccessTokenConfig {
***@Bean
TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
***@Bean
JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
("javaboy");
return converter;
}
}
1. TokenStore 我们使⽤ JwtTokenStore 这个实例。使⽤了 JWT,access_token 实际上就不⽤存储了(⽆状态登录,服务端不需要保存信
息),因为⽤户的所有信息都在 jwt ⾥边,所以这⾥配置的 JwtTokenStore 本质上并不是做存储。 : .
2. 另外我们还提供了⼀个 JwtAccessTokenConverter,这个 JwtAccessTokenConverter 可以实现将⽤户信息和 JWT 进⾏转换(将⽤户
信息转为 jwt 字符串,或者从 jwt 字符串提取出⽤户信息)。
3. 另外,在 JWT 字符串⽣成的时候,我们需要⼀个签名,这个签名需要⾃⼰保存好。
接下来对授权服务器进⾏详细配置:
***@EnableAuthorizationServer
***@Configuration
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {
***@Autowired
TokenStore tokenStore;
***@Autowired
ClientDetailsService clientDetailsService;
***@Autowired
AuthenticationManager authenticationManager;
***@Autowired
PasswordEncoder passwordEncoder;
***@Autowired
JwtAccessTokenConverter jwtAccessTokenConverter;
***@Bean
AuthorizationServerTokenServices tokenServices() {
DefaultTokenServices services = new DefaultTokenServices();
(clientDetailsService);
(true);
(tokenStore);
(60 * 60 * 24 * 2);
(60 * 60 * 24 * 7);
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
((jwtAccessTokenConverter));
(tokenEnhancerChain);
return services;
}
***@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
();
}
***@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
()
.withClient("javaboy")
.secret(("123"))
.resourceIds("res1")
.authorizedGrantTypes("password", "refresh_token")
.scopes("all")
.redirectUris("http://localhost:8082/");
}
***@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.authenticationManager(authenticationManager)
.tokenServices(tokenServices());
}
}
这段代码有点长,我来给⼤家挨个解释:
1. 创建 AuthorizationServer 类继承⾃ AuthorizationServerConfigurerAdapter,来对授权服务器做进⼀步的详细配
置,AuthorizationServer 类记得加上 ***@EnableAuthorizationServer 注解,表⽰开启授权服务器的⾃动化配置。
2. 在 AuthorizationServer 类中,我们其实主要重写三个 configure ⽅法。
3. AuthorizationServerSecurityConfigurer ⽤来配置令牌端点的安全约束,也就是这个端点谁能访问,谁不能访问。 : .
4. ClientDetailsServiceConfigurer ⽤来配置客户端的详细信息,在 之前⽂章中,松哥和⼤家讲过,授权服务器要做两⽅⾯的检验,⼀⽅⾯是校
验客户端,另⼀⽅⾯则是校验⽤户,校验⽤户,我们前⾯已经配置了,这⾥就是配置校验客户端。客户端的信息我们可以存在数据库中,这其
实也是⽐较容易的,和⽤户信息存到数据库中类似,但是这⾥为了简化代码,我还是将客户端信息存在内存中,这⾥我们分别配置了客户端的
id,secret、资源 id、授权类型、授权范围以及重定向 uri。授权类型我在之前⽂章中和⼤家⼀共讲了四种,四种之中不包含 refresh_token
这种类型,但是在实际操作中,refresh_token 也被算作⼀种。
5. AuthorizationServerEndpointsConfigurer 这⾥⽤来配置令牌的访问端点和令牌服务。
6. tokenServices 这个 Bean 主要⽤来配置 Token 的⼀些基本信息,例如 Token 是否⽀持刷新、Token 的存储位置、Token 的有效期以及
刷新 Token 的有效期等等。Token 有效期这个好理解,刷新 Token 的有效期我说⼀下,当 Token 快要过期的时候,我们需要获取⼀个新
的 Token,在获取新的 Token 时候,需要有⼀个凭证信息,这个凭证信息不是旧的 Token,⽽是另外⼀个 refresh_token,这个
refresh_token 也是有有效期的。
好了,如此之后,我们的授权服务器就算是配置完成了,接下来我们启动授权服务器。
如果⼩伙伴们对于上⾯的配置感到迷糊,可以在公众号后台回复 OAuth2,先系统的学习⼀下松哥的 OAuth2 教程。
资源服务器搭建
接下来我们搭建⼀个资源服务器。⼤家⽹上看到的例⼦,资源服务器⼤多都是和授权服务器放在⼀起的,如果项⽬⽐较⼩的话,这样做是没问题
的,但是如果是⼀个⼤项⽬,这种做法就不合适了。
资源服务器就是⽤来存放⽤户的资源,例如你在微信上的图像、openid 等信息,⽤户从授权服务器上拿到 access_token 之后,接下来就可以
通过 access_token 来资源服务器请求数据。
我们创建⼀个新的 Spring Boot 项⽬,叫做 user-server ,作为我们的资源服务器,创建时,添加如下依赖:
image
项⽬创建成功之后,先把前⾯的 AccessTokenConfig 拷贝到资源服务器上,然后添加如下配置: : .
***@Configuration
***@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
***@Autowired
TokenStore tokenStore;
***@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
("res1").tokenStore(tokenStore);
}
***@Override
public void configure(HttpSecurity http) throws Exception {
()
.antMatchers("/admin/**").hasRole("admin")
.anyRequest().authenticated();
}
}
这段配置代码很简单,我简单的说⼀下:
1. ⾸先在 configure ⽅法中配置资源 ID 和 TokenStore,这⾥配置好之后,会⾃动调⽤ JwtAccessTokenConverter 将 jwt 解析出来,jwt
⾥边就包含了⽤户的基本信息,所以就不⽤远程校验 access_token 了。
2. 最后配置⼀下资源的拦截规则,这就是 Spring Security 中的基本写法,我就不再赘述。
接下来我们再来配置两个测试接⼝:
***@RestController
public class HelloController {
***@GetMapping("/hello")
public String hello() {
return "hello";
}
***@GetMapping("/admin/hello")
public String admin() {
return "admin";
}
}
如此之后,我们的资源服务器就算配置成功了。
测试
分别启动授权服务器和资源服务器,先访问授权服务器获取 access_token: : .
image
再利⽤拿到的 access_token 去访问资源服务器:
image
OK,测试没问题。
Swagger
接下来,我们在 user-server 中加⼊ swagger 功能,⾸先我们加⼊ swagger 依赖:
springfox-swagger2
springfox-swagger-ui
这⾥加⼊的依赖有两个,⼀个⽤来⽣成接⼝数据,另⼀个 swagger-ui ⽤来做数据展⽰。
认证⽅式⼀
请求头加参数,这⾥给⼤家介绍两种,先来看第⼀种。
先配置⼀个 Docket 实例,如下: : .
***@Configuration
***@EnableSwagger2
public class Swagger2Config {
***@Bean
Docket docket() {
return new Docket()
.select()
.apis((""))
.paths(())
.build()
.securityContexts((securityContexts()))
.securitySchemes((securitySchemes()))
.apiInfo(new ApiInfoBuilder()
接 ⼝.description("⽂档的描述信息")
微 ⼈ 事 项 ⽬.title("接⼝⽂档")
.contact(newContact("javaboy","","**********************"))
.version("")
.license("")
.build());
}
private SecurityScheme securitySchemes() {
return new ApiKey("Authorization", "Authorization", "header");
}
private SecurityContext securityContexts() {
return ()
.securityReferences(defaultAuth())