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看到这个问题,松哥忽然想到我??之前写过SpringBoot+Swagger的?法:SpringBoot整合Swagger2也写过OAuth2+Jwt的?法:想让OAuth2和JWT在?起愉快玩耍?请看松哥的表演但是还没有将这两个结合在?起写过,所以?伙伴们对此有了疑问,想?想这还是?个?常常见的问题,因为现在使?令牌登录的场景越来越多,在这种情况下,如果使?Swagger来测试接?,要怎么在请求头中携带Token呢?今天松哥就来和?家聊?聊。?规划如果?伙伴们没有看过松哥之前发的OAuth2系列?章,建议?定先看下(公众号江南?点?后台回复OAuth2获取),再来看本?内容,否则接下来的内容可能会犯迷糊。这?松哥搭建?个OAuth2+JWT的环境来做演?。?共搭建两个服务:服务名端?备注auth-server8080授权服务器user-server8081资源服务器我稍微解释?下:auth-server就是我的资源服务器,?来颁发JWT令牌。user-server则是资源服务器,访问user-server上的资源,都需要携带令牌才能访问。swagger则?来给user-server上的接??成?档。OK,这是我们项?的?个?致规划。:..接下来我们来搭建OAuth2测试环境。?先我们搭建?个名为auth-server的授权服务,搭建的时候,选择如下三个依赖:WebSpringCloudSecuritySpirngCloudOAuth2image项?创建完成后,?先提供?个SpringSecurity的基本配置::..***@ConfigurationlassSecurityConfigextendsWebSecurityConfigurerAdapter{***@BeanPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}***@******@BeanpublicAuthenticationManagerauthenticationManagerBean()throwsException{();}***@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{().withUser("sang").password(passwordEncoder().encode("123")).roles("admin").and().withUser("javaboy").password(passwordEncoder().encode("123")).roles("user");}***@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{().disable().formLogin();}}在这段代码中,为了代码简洁,我就不把SpringSecurity?户存到数据库中去了,直接存在内存中。这?我创建了?个名为sang的?户,密码是123,??是admin。同时我还配置了?个表单登录。这段配置的?的,实际上就是配置?户。例如你想?微信登录第三??站,在这个过程中,你得先登录微信,登录微信就要你的?户名/密码信息,那么我们在这?配置的,其实就是?户的?户名/密码/??信息。需要注意的是,在当前案例中,我将采?OAuth2中的password模式进?登录,因此这?还需要明确的提供?个AuthenticationManager的Bean。基本的?户信息配置完成后,接下来我们来配置授权服务器。?先来配置TokenStore:***@ConfigurationessTokenConfig{***@BeanTokenStoretokenStore(){returnnewJwtTokenStore(essTokenConverter());}***@BeanessTokenConverter(){essTokenConverterconverter=essTokenConverter();("javaboy");returnconverter;}}?JwtTokenStore这个实例。使?了JWT,access_token实际上就不?存储了(?状态登录,服务端不需要保存信息),因为?户的所有信息都在jwt?边,所以这?配置的JwtTokenStore本质上并不是做存储。:..?essTokenConverter,essTokenConverter可以实现将?户信息和JWT进?转换(将?户信息转为jwt字符串,或者从jwt字符串提取出?户信息)。,在JWT字符串?成的时候,我们需要?个签名,这个签名需要??保存好。接下来对授权服务器进?详细配置:***@******@ConfigurationlassAuthorizationServerextendsAuthorizationServerConfigurerAdapter{***@AutowiredTokenStoretokenStore;***@AutowiredClientDetailsServiceclientDetailsService;***@AutowiredAuthenticationManagerauthenticationManager;***@AutowiredPasswordEncoderpasswordEncoder;***@AutowiredessTokenConverter;***@BeanAuthorizationServerTokenServicestokenServices(){DefaultTokenServicesservices=newDefaultTokenServices();(clientDetailsService);(true);(tokenStore);(60*60*24*2);(60*60*24*7);TokenEnhancerChaintokenEnhancerChain=newTokenEnhancerChain();((essTokenConverter));(tokenEnhancerChain);returnservices;}***@Overridepublicvoidconfigure(AuthorizationServerSecurityConfigurersecurity)throwsException{();}***@Overridepublicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{().withClient("javaboy").secret(("123")).resourceIds("res1").authorizedGrantTypes("password","refresh_token").scopes("all").redirectUris("http://localhost:8082/");}***@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{(authenticationManager).tokenServices(tokenServices());}}这段代码有点长,我来给?家挨个解释:?AuthorizationServerConfigurerAdapter,来对授权服务器做进?步的详细配置,AuthorizationServer类记得加上***@EnableAuthorizationServer注解,表?开启授权服务器的?动化配置。,我们其实主要重写三个configure?法。?来配置令牌端点的安全约束,也就是这个端点谁能访问,谁不能访问。:..?来配置客户端的详细信息,在之前?章中,松哥和?家讲过,授权服务器要做两??的检验,???是校验客户端,另???则是校验?户,校验?户,我们前?已经配置了,这?就是配置校验客户端。客户端的信息我们可以存在数据库中,这其实也是?较容易的,和?户信息存到数据库中类似,但是这?为了简化代码,我还是将客户端信息存在内存中,这?我们分别配置了客户端的id,secret、资源id、授权类型、授权范围以及重定向uri。授权类型我在之前?章中和?家?共讲了四种,四种之中不包含refresh_token这种类型,但是在实际操作中,refresh_token也被算作?种。??来配置令牌的访问端点和令牌服务。?来配置Token的?些基本信息,例如Token是否?持刷新、Token的存储位置、Token的有效期以及刷新Token的有效期等等。Token有效期这个好理解,刷新Token的有效期我说?下,当Token快要过期的时候,我们需要获取?个新的Token,在获取新的Token时候,需要有?个凭证信息,这个凭证信息不是旧的Token,?是另外?个refresh_token,这个refresh_token也是有有效期的。好了,如此之后,我们的授权服务器就算是配置完成了,接下来我们启动授权服务器。如果?伙伴们对于上?的配置感到迷糊,可以在公众号后台回复OAuth2,先系统的学****下松哥的OAuth2教程。?个资源服务器。?家?上看到的例?,资源服务器?多都是和授权服务器放在?起的,如果项??较?的话,这样做是没问题的,但是如果是?个?项?,这种做法就不合适了。资源服务器就是?来存放?户的资源,例如你在微信上的图像、openid等信息,?ess_token之后,接下来就可以ess_token来资源服务器请求数据。我们创建?个新的SpringBoot项?,叫做user-server,作为我们的资源服务器,创建时,添加如下依赖:image项?创建成功之后,先把前?essTokenConfig拷贝到资源服务器上,然后添加如下配置::..***@******@EnableResourceServerlassResourceServerConfigextendsResourceServerConfigurerAdapter{***@AutowiredTokenStoretokenStore;***@Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{("res1").tokenStore(tokenStore);}***@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{().antMatchers("/admin/**").hasRole("admin").anyRequest().authenticated();}}这段配置代码很简单,我简单的说?下:1.?先在configure?法中配置资源ID和TokenStore,这?配置好之后,会?动调?essTokenConverter将jwt解析出来,jwt?边就包含了?户的基本信息,所以就不?ess_token了。?下资源的拦截规则,这就是SpringSecurity中的基本写法,我就不再赘述。接下来我们再来配置两个测试接?:***@RestControllerlassHelloController{***@GetMapping("/hello")publicStringhello(){return"hello";}***@GetMapping("/admin/hello")publicStringadmin(){return"admin";}}如此之后,我们的资源服务器就算配置成功了。,ess_token::..image再利?ess_token去访问资源服务器:imageOK,测试没问题。,我们在user-server中加?swagger功能,?先我们加?swagger依赖:--swagger-?加?的依赖有两个,?个?来?成接?数据,另?个swagger-ui?来做数据展?。?式?请求头加参数,这?给?家介绍两种,先来看第?种。先配置?个Docket实例,如下::..***@******@EnableSwagger2lassSwagger2Config{***@BeanDocketdocket(){returnnewDocket().select().apis(("")).paths(()).build().securityContexts((securityContexts())).securitySchemes((securitySchemes())).apiInfo(newApiInfoBuilder()接?.description("?档的描述信息")微?事项?.title("接??档").contact(newContact("javaboy","","**********************")).version("").license("").build());}privateSecuritySchemesecuritySchemes(){returnnewApiKey("Authorization","Authorization","header");}privateSecurityContextsecurityContexts(){().securityReferences(defaultAuth()).forPaths(()).build();}privateListdefaultAuth(){AuthorizationScopeauthorizationScope=newAuthorizationScope("xxx",描述信息");"AuthorizationScope[]authorizationScopes=newAuthorizationScope[1];authorizationScopes[0]=authorizationScope;(newSecurityReference("Authorization",authorizationScopes));}}这?的配置稍微有点长,我来给?家解释下:?先通过***@EnableSwagger2注解启?Swagger2。配置?个DocketBean,这个Bean中,配置映射路径和要扫描的接?的位置。在apiInfo中,主要配置?下Swagger2?档?站的信息,例如?站的title,?站的描述,联系?的信息,使?的协议等等。通过securitySchemes来配置全局参数,这?的配置是?个名为Authorization的请求头(OAuth2中需要携带的请求头)。securityContexts则?来配置有哪些请求需要携带Token,这?我们配置了所有请求。配置完成后,我们还需要给swagger-ui放?,否则swagger-ui相关的静态资源会被SpringSecurity拦截下来:***@ConfigurationlassSecurityConfigextendsWebSecurityConfigurerAdapter{***@Overridepublicvoidconfigure(WebSecurityweb)throwsException{().antMatchers("/swagger-").antMatchers("/webjars/**").antMatchers("/v2/**").antMatchers("/swagger-resources/**");}}:..image?家可以看到,页?中多了?个Authorize按钮,点击该按钮,输?Bearer${tok,如en}下:image输?完成后,点击Authorize按钮,完成认证,接下来,user-server中的各种接?就可以直接调?测试了。上?这种?式?较通?,不仅仅适?于OAuth2,也适?于其他?些?定义的token登录?式。但是这种?ess_token,有的?会觉得这样有点?烦,那么有没有更好的办法呢?请看?式?。:..?式?认证?式?就是直接在Swagger中填?认证信息,这样就不?ess_token了,效果如下:image:..image我们来看下这个怎么配置。由于swagger去请求/oauth/token接?会跨域,所以我们?先要修改auth-server,使之?持跨域:主要是两??的修改,?先是配置CorsFilter,允许跨域,如下:***@ConfigurationlassGlobalCorsConfiguration{***@BeanorsFiltercorsFilter(){CorsConfigurationcorsConfiguration=newCorsConfiguration();(true);("*");("*");("*");UrlBasedCorsConfigurationSourceurlBasedCorsConfigurationSource=newUrlBasedCorsConfigurationSource();("/**",corsConfiguration);returnnewCorsFilter(urlBasedCorsConfigurationSource);}}然后在SecurityConfig中开启跨域?持:***@******@Order()lassSecurityConfigextendsWebSecurityConfigurerAdapter{......***@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{().antMatchers(,"/oauth/**").and().csrf().disable().formLogin().and().cors();}}经过这两步的配置,服务端的跨域?持就开启了。接下来我们在user-server中修改关于Docketbean的定义::..***@******@EnableSwagger2lassSwagger2Config{***@BeanDocketdocket(){returnnewDocket().select().apis(("")).paths(()).build().securityContexts((securityContext())).securitySchemes((securityScheme())).apiInfo(newApiInfoBuilder()接?.description("?档的描述信息")微?事项?.title("接??档").contact(newContact("javaboy","","**********************")).version("").license("").build());}privateAuthorizationScope[]scopes(){returnnewAuthorizationScope[]{newAuthorizationScope("all","allscope")};}privateSecuritySchemesecurityScheme(){GrantTypegrant=newResourceOwnerPasswordCredentialsGrant("http://localhost:8080/oauth/token");returnnewOAuthBuilder().name("OAuth2").grantTypes((grant)).scopes((scopes())).build();}privateSecurityContextsecurityContext(){().securityReferences((newSecurityReference("OAuth2",scopes()))).forPaths(()).build();}}这段配置跟前?的类似,主要是SecurityScheme不同。这?采?了OAuthBuilder来构建,构建时即得配置token的获取地址。好了,配置完成,重启auth-server和user-server进?测试。测试效果就是松哥前?给出的图?,不再赘述。这种?式最?的好处就是不?ess_token,直接在swagger-ui页?输?password模式的认证参数即可。?常?便,仅限于OAuth2模式。4.?结好了,今天就和?伙伴们介绍了在Swagger请求中,如何修改请求头的问题,感兴趣的?伙伴可以下来试试哦~好啦,?伙伴们如果觉得有收获,记得点个在看?励下松哥哦~