1 / 12
文档名称:

用Swagger测试接口,怎么在请求头中携带Token.pdf

格式:pdf   大小:696KB   页数:12页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

用Swagger测试接口,怎么在请求头中携带Token.pdf

上传人:鼠标 2023/6/8 文件大小:696 KB

下载得到文件列表

用Swagger测试接口,怎么在请求头中携带Token.pdf

相关文档

文档介绍

文档介绍:该【用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())

最近更新

部编版三年级语文上册期中考试题(最新) 6页

部编版三年级语文上册期末考试卷【带答案】 7页

部编版三年级语文下册期中达标考试卷 6页

部编版二年级上册语文期末试卷(A4版) 5页

工程领域的创新与发展-毕业答辩PPT大纲 42页

部编版二年级语文上册一单元模拟题及答案 5页

部编版二年级语文上册四单元试卷及答案(A4打印.. 5页

部编版二年级语文上册期末模拟考试及答案下载.. 4页

工程监理新纪元-探索市场前景与盈利模式 25页

部编版二年级语文上册第二次月考练习及答案 4页

部编版五年级语文上册三单元试卷及答案(完美版.. 5页

工程技术实践分享-提升工程技术实践能力 31页

部编版五年级语文上册第二次月考试卷附答案 5页

部编版五年级语文下册期末考试题(附参考答案).. 8页

部编版六年级语文(下册)期中试卷及答案(最新).. 7页

部编版六年级语文上册二单元提升练习卷及答案.. 7页

部编版六年级语文上册期中试题及答案一 6页

部编版四年级上册语文《期中》考试卷及答案【.. 7页

部编版四年级上册语文《期末》测试卷【附答案.. 7页

部编版四年级上册语文《期末》试卷【参考答案.. 7页

部编版四年级数学上册期中考试卷【及答案】 6页

部编版四年级语文(下册)期中摸底测试及答案 6页

青岛版一年级数学上册期中考试题(通用) 7页

部编版四年级语文下册期末试题(汇编) 7页

青岛版一年级数学上册期中测试卷及答案【1套】.. 5页

青岛版一年级数学上册期中考试及答案【A4版】.. 7页

青岛版二年级数学上册期中试卷(1套) 6页

青岛版四年级数学上册期中考试卷及答案【完整.. 6页

青岛版四年级数学上册期中考试题附答案 6页

外部存储器公开课获奖课件赛课一等奖课件 43页