最全用 Swagger 测试接口,怎么在请求头中携带 Token?(2),2024年最新字节跳动软件测试内部学习资料泄露

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

首先来配置 TokenStore:

@Configuration

public class AccessTokenConfig {

@Bean

TokenStore tokenStore() {

return new JwtTokenStore(jwtAccessTokenConverter());

}

@Bean

JwtAccessTokenConverter jwtAccessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();

converter.setSigningKey(“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();

services.setClientDetailsService(clientDetailsService);

services.setSupportRefreshToken(true);

services.setTokenStore(tokenStore);

services.setAccessTokenValiditySeconds(60 * 60 * 24 * 2);

services.setRefreshTokenValiditySeconds(60 * 60 * 24 * 7);

TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();

tokenEnhancerChain.setTokenEnhancers(Arrays.asList(jwtAccessTokenConverter));

services.setTokenEnhancer(tokenEnhancerChain);

return services;

}

@Override

public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {

security.allowFormAuthenticationForClients();

}

@Override

public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

clients.inMemory()

.withClient(“javaboy”)

.secret(passwordEncoder.encode(“123”))

.resourceIds(“res1”)

.authorizedGrantTypes(“password”, “refresh_token”)

.scopes(“all”)

.redirectUris(“http://localhost:8082/index.html”);

}

@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 教程。

2.2 资源服务器搭建

接下来我们搭建一个资源服务器。大家网上看到的例子,资源服务器大多都是和授权服务器放在一起的,如果项目比较小的话,这样做是没问题的,但是如果是一个大项目,这种做法就不合适了。

资源服务器就是用来存放用户的资源,例如你在微信上的图像、openid 等信息,用户从授权服务器上拿到 access_token 之后,接下来就可以通过 access_token 来资源服务器请求数据。

我们创建一个新的 Spring Boot 项目,叫做 user-server ,作为我们的资源服务器,创建时,添加如下依赖:

项目创建成功之后,先把前面的 AccessTokenConfig 拷贝到资源服务器上,然后添加如下配置:

@Configuration

@EnableResourceServer

public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Autowired

TokenStore tokenStore;

@Override

public void configure(ResourceServerSecurityConfigurer resources) throws Exception {

resources.resourceId(“res1”).tokenStore(tokenStore);

}

@Override

public void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.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”;

}

}

如此之后,我们的资源服务器就算配置成功了。

2.3 测试

分别启动授权服务器和资源服务器,先访问授权服务器获取 access_token:

再利用拿到的 access_token 去访问资源服务器:

OK,测试没问题。

3.整合 Swagger


接下来,我们在 user-server 中加入 swagger 功能,首先我们加入 swagger 依赖:

io.springfox

springfox-swagger2

2.9.2

io.springfox

springfox-swagger-ui

2.9.2

这里加入的依赖有两个,一个用来生成接口数据,另一个 swagger-ui 用来做数据展示。

3.1 认证方式一

请求头加参数,这里给大家介绍两种,先来看第一种。

先配置一个 Docket 实例,如下:

@Configuration

@EnableSwagger2

public class Swagger2Config {

@Bean

Docket docket() {

return new Docket(DocumentationType.SWAGGER_2)

.select()

.apis(RequestHandlerSelectors.basePackage(“org.javaboy.oauth2.res.controller”))

.paths(PathSelectors.any())

.build()

.securityContexts(Arrays.asList(securityContexts()))

.securitySchemes(Arrays.asList(securitySchemes()))

.apiInfo(new ApiInfoBuilder()

.description(“接口文档的描述信息”)

.title(“微人事项目接口文档”)

.contact(new Contact(“javaboy”,“http://www.javaboy.org”,“wangsong0210@gmail.com”))

.version(“v1.0”)

.license(“Apache2.0”)

.build());

}

private SecurityScheme securitySchemes() {

return new ApiKey(“Authorization”, “Authorization”, “header”);

}

private SecurityContext securityContexts() {

return SecurityContext.builder()

.securityReferences(defaultAuth())

.forPaths(PathSelectors.any())

.build();

}

private List defaultAuth() {

AuthorizationScope authorizationScope = new AuthorizationScope(“xxx”, “描述信息”);

AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];

authorizationScopes[0] = authorizationScope;

return Arrays.asList(new SecurityReference(“Authorization”, authorizationScopes));

}

}

这里的配置稍微有点长,我来给大家解释下:

  • 首先通过 @EnableSwagger2 注解启用 Swagger2。

  • 配置一个 Docket Bean,这个 Bean 中,配置映射路径和要扫描的接口的位置。

  • 在 apiInfo 中,主要配置一下 Swagger2 文档网站的信息,例如网站的 title,网站的描述,联系人的信息,使用的协议等等。

  • 通过 securitySchemes 来配置全局参数,这里的配置是一个名为 Authorization 的请求头(OAuth2 中需要携带的请求头)。

  • securityContexts 则用来配置有哪些请求需要携带 Token,这里我们配置了所有请求。

配置完成后,我们还需要给 swagger-ui 放行,否则 swagger-ui 相关的静态资源会被 Spring Security 拦截下来:

@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override

public void configure(WebSecurity web) throws Exception {

web.ignoring().antMatchers(“/swagger-ui.html”)

.antMatchers(“/webjars/**”)

.antMatchers(“/v2/**”)

.antMatchers(“/swagger-resources/**”);

}

}

配置完成后,重启 user-server,浏览器输入 http://localhost:8081/swagger-ui.html,结果如下:

大家可以看到,页面中多了一个 Authorize 按钮,点击该按钮,输入 Bearer ${token},如下:

输入完成后,点击 Authorize 按钮,完成认证,接下来,user-server 中的各种接口就可以直接调用测试了。

上面这种方式比较通用,不仅仅适用于 OAuth2,也适用于其他一些自定义的 token 登录方式。

但是这种方式需要开发者先通过其他途径获取到 access_token,有的人会觉得这样有点麻烦,那么有没有更好的办法呢?请看方式二。

3.2 认证方式二

认证方式二就是直接在 Swagger 中填入认证信息,这样就不用从外部去获取 access_token 了,效果如下:

我们来看下这个怎么配置。

由于 swagger 去请求 /oauth/token 接口会跨域,所以我们首先要修改 auth-server ,使之支持跨域:

主要是两方面的修改,首先是配置 CorsFilter,允许跨域,如下:

@Configuration

public class GlobalCorsConfiguration {

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2LnBuZw?x-oss-process=image/format,png)

我们来看下这个怎么配置。

由于 swagger 去请求 /oauth/token 接口会跨域,所以我们首先要修改 auth-server ,使之支持跨域:

主要是两方面的修改,首先是配置 CorsFilter,允许跨域,如下:

@Configuration

public class GlobalCorsConfiguration {

[外链图片转存中…(img-EyZHxtLu-1715398189048)]
[外链图片转存中…(img-qJUCVIY4-1715398189048)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值