docket

更新时间:2022-11-25 16:00:23 阅读: 评论:0


2022年11月25日发(作者:工程开工典礼发言稿)

怎么获取请求头中的origin信息_⽤Swagger测试接⼝,怎么在

请求头中携带Token?

来⾃⼀个⼩伙伴在微信上的提问:

看到这个问题,松哥忽然想到我⾃⼰之前写过SpringBoot+Swagger的⽤法:

SpringBoot整合Swagger2

也写过OAuth2+Jwt的⽤法:

想让OAuth2和JWT在⼀起愉快玩耍?请看松哥的表演

但是还没有将这两个结合在⼀起写过,所以⼩伙伴们对此有了疑问,想⼀想这还是⼀个⾮常常见的问题,因为现在使⽤令牌登录的场景越来

越多,在这种情况下,如果使⽤Swagger来测试接⼝,要怎么在请求头中携带Token呢?今天松哥就来和⼤家聊⼀聊。

1.项⽬规划

如果⼩伙伴们没有看过松哥之前发的OAuth2系列⽂章,建议⼀定先看下(公众号江南⼀点⾬后台回复OAuth2获取),再来看本⽂内容,

否则接下来的内容可能会犯迷糊。

这⾥松哥搭建⼀个OAuth2+JWT的环境来做演⽰。⼀共搭建两个服务:

服务名端⼝备注auth-rver8080授权服务器ur-rver8081资源服务器

我稍微解释⼀下:

auth-rver就是我的资源服务器,⽤来颁发JWT令牌。

ur-rver则是资源服务器,访问ur-rver上的资源,都需要携带令牌才能访问。

swagger则⽤来给ur-rver上的接⼝⽣成⽂档。

OK,这是我们项⽬的⼀个⼤致规划。

2.环境搭建

接下来我们来搭建OAuth2测试环境。

2.1授权服务器搭建

⾸先我们搭建⼀个名为auth-rver的授权服务,搭建的时候,选择如下三个依赖:

Web

SpringCloudSecurity

SpirngCloudOAuth2

项⽬创建完成后,⾸先提供⼀个SpringSecurity的基本配置:

@ConfigurationpublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{@BeanPasswordEncoderpasswordEncoder(){returnnewB

在这段代码中,为了代码简洁,我就不把SpringSecurity⽤户存到数据库中去了,直接存在内存中。

这⾥我创建了⼀个名为sang的⽤户,密码是123,⾓⾊是admin。同时我还配置了⼀个表单登录。

这段配置的⽬的,实际上就是配置⽤户。例如你想⽤微信登录第三⽅⽹站,在这个过程中,你得先登录微信,登录微信就要你的⽤户名/密

码信息,那么我们在这⾥配置的,其实就是⽤户的⽤户名/密码/⾓⾊信息。

需要注意的是,在当前案例中,我将采⽤OAuth2中的password模式进⾏登录,因此这⾥还需要明确的提供⼀个

AuthenticationManager的Bean。

基本的⽤户信息配置完成后,接下来我们来配置授权服务器。

⾸先来配置TokenStore:

@ConfigurationpublicclassAccessTokenConfig{@BeanTokenStoretokenStore(){returnnewJwtTokenStore(jwtAccessTokenConverter());}

tore我们使⽤JwtTokenStore这个实例。使⽤了JWT,access_token实际上就不⽤存储了(⽆状态登录,服务端不需要保

存信息),因为⽤户的所有信息都在jwt⾥边,所以这⾥配置的JwtTokenStore本质上并不是做存储。

2.另外我们还提供了⼀个JwtAccessTokenConverter,这个JwtAccessTokenConverter可以实现将⽤户信息和JWT进⾏转换(将

⽤户信息转为jwt字符串,或者从jwt字符串提取出⽤户信息)。

3.另外,在JWT字符串⽣成的时候,我们需要⼀个签名,这个签名需要⾃⼰保存好。

接下来对授权服务器进⾏详细配置:

@EnableAuthorizationServer@ConfigurationpublicclassAuthorizationServerextendsAuthorizationServerConfigurerAdapter{@AutowiredTokenStore

这段代码有点长,我来给⼤家挨个解释:

1.创建AuthorizationServer类继承⾃AuthorizationServerConfigurerAdapter,来对授权服务器做进⼀步的详细配

置,AuthorizationServer类记得加上@EnableAuthorizationServer注解,表⽰开启授权服务器的⾃动化配置。

2.在AuthorizationServer类中,我们其实主要重写三个configure⽅法。

izationServerSecurityConfigurer⽤来配置令牌端点的安全约束,也就是这个端点谁能访问,谁不能访问。

DetailsServiceConfigurer⽤来配置客户端的详细信息,在之前⽂章中,松哥和⼤家讲过,授权服务器要做两⽅⾯的检验,⼀

⽅⾯是校验客户端,另⼀⽅⾯则是校验⽤户,校验⽤户,我们前⾯已经配置了,这⾥就是配置校验客户端。客户端的信息我们可以存

在数据库中,这其实也是⽐较容易的,和⽤户信息存到数据库中类似,但是这⾥为了简化代码,我还是将客户端信息存在内存中,这

⾥我们分别配置了客户端的id,cret、资源id、授权类型、授权范围以及重定向uri。授权类型我在之前⽂章中和⼤家⼀共讲了四

种,四种之中不包含refresh_token这种类型,但是在实际操作中,refresh_token也被算作⼀种。

izationServerEndpointsConfigurer这⾥⽤来配置令牌的访问端点和令牌服务。

ervices这个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来资源服务器请求数据。

我们创建⼀个新的SpringBoot项⽬,叫做ur-rver,作为我们的资源服务器,创建时,添加如下依赖:

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

@Configuration@EnableResourceServerpublicclassResourceServerConfigextendsResourceServerConfigurerAdapter{@AutowiredTokenStoretok

这段配置代码很简单,我简单的说⼀下:

1.⾸先在configure⽅法中配置资源ID和TokenStore,这⾥配置好之后,会⾃动调⽤JwtAccessTokenConverter将jwt解析出

来,jwt⾥边就包含了⽤户的基本信息,所以就不⽤远程校验access_token了。

2.最后配置⼀下资源的拦截规则,这就是SpringSecurity中的基本写法,我就不再赘述。

接下来我们再来配置两个测试接⼝:

@RestControllerpublicclassHelloController{@GetMapping("/hello")publicStringhello(){return"hello";}@GetMapping("/admin/hello")pub

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

2.3测试

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

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

OK,测试没问题。

3.整合Swagger

接下来,我们在ur-rver中加⼊swagger功能,⾸先我们加⼊swagger依赖:

foxspringfox-swagger-ui2.9.2

这⾥加⼊的依赖有两个,⼀个⽤来⽣成接⼝数据,另⼀个swagger-ui⽤来做数据展⽰。

3.1认证⽅式⼀

请求头加参数,这⾥给⼤家介绍两种,先来看第⼀种。

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

@Configuration@EnableSwagger2publicclassSwagger2Config{@BeanDocketdocket(){returnnewDocket(R_2

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

⾸先通过@EnableSwagger2注解启⽤Swagger2。

配置⼀个DocketBean,这个Bean中,配置映射路径和要扫描的接⼝的位置。

在apiInfo中,主要配置⼀下Swagger2⽂档⽹站的信息,例如⽹站的title,⽹站的描述,联系⼈的信息,使⽤的协议等等。

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

curityContexts则⽤来配置有哪些请求需要携带Token,这⾥我们配置了所有请求。

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

@ConfigurationpublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{@Overridepublicvoidconfigure(WebSecurityweb)throwsExcep

⼤家可以看到,页⾯中多了⼀个Authorize按钮,点击该按钮,输⼊Bearer${token},如下:

输⼊完成后,点击Authorize按钮,完成认证,接下来,ur-rver中的各种接⼝就可以直接调⽤测试了。

上⾯这种⽅式⽐较通⽤,不仅仅适⽤于OAuth2,也适⽤于其他⼀些⾃定义的token登录⽅式。

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

3.2认证⽅式⼆

认证⽅式⼆就是直接在Swagger中填⼊认证信息,这样就不⽤从外部去获取access_token了,效果如下:

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

由于swagger去请求/oauth/token接⼝会跨域,所以我们⾸先要修改auth-rver,使之⽀持跨域:

主要是两⽅⾯的修改,⾸先是配置CorsFilter,允许跨域,如下:

@ConfigurationpublicclassGlobalCorsConfiguration{@BeanpublicCorsFiltercorsFilter(){CorsConfigurationcorsConfiguration=newCorsConf

然后在SecurityConfig中开启跨域⽀持:

@Configuration@Order(T_PRECEDENCE)publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{......@Override

经过这两步的配置,服务端的跨域⽀持就开启了。

接下来我们在ur-rver中修改关于Docketbean的定义:

@Configuration@EnableSwagger2publicclassSwagger2Config{@BeanDocketdocket(){returnnewDocket(R_2

这段配置跟前⾯的类似,主要是SecurityScheme不同。这⾥采⽤了OAuthBuilder来构建,构建时即得配置token的获取地址。

好了,配置完成,重启auth-rver和ur-rver进⾏测试。测试效果就是松哥前⾯给出的图⽚,不再赘述。

这种⽅式最⼤的好处就是不⽤通过其他途径获取access_token,直接在swagger-ui页⾯输⼊password模式的认证参数即可。⾮常⽅

便,仅限于OAuth2模式。

4.⼩结

好了,今天就和⼩伙伴们介绍了在Swagger请求中,如何修改请求头的问题,感兴趣的⼩伙伴可以下来试试哦~

好啦,⼩伙伴们如果觉得有收获,记得点个在看⿎励下松哥哦~

本文发布于:2022-11-25 16:00:23,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/19454.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:never say die
下一篇:stonehenge
标签:docket
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图