问题
授权服务器基于Spring Cloud Oauth2创建后,配置TokenStore为JwtTokenStore,访问/oauth/token接口,依然返回普通token,如下如所示。
如图所示,生成的2个token,均不是jwt。
授权服务器Endpoints配置项内,配置TokenStore为JwtTokenStore,代码如下。
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.tokenStore(new JwtTokenStore(jwtAccessTokenConverter()));
;
}
分析
查看TokenEndPoint中/oauth/token申请逻辑。
由TokenGranter授权Token。而grant方法调用tokenServices创建Token。
DefaultTokenServices创建token逻辑如下。
如果accessTokenEnhancer存在,则做token增强,如果不存在,则返回普通token。回到问题之初,正是返回了普通token,所以,最大的可能便是此处的accessTokenEnhancer为空。
接下来,查看一下框架配置,重点探寻accessTokenEnhancer是如何初始化的,怎么能导致为空。
由于创建token逻辑是在DefaultTokenServices中,所以先查看一下DefaultTokenServices是如何创建的。
其中,tokenEnhancer方法逻辑如下。
逻辑比较明显,如果tokenEnhancer为空,同时,此时的accessTokenConverter为JwtAccessTokenConverter时,tokenEnhancer便赋值为accessTokenConverter,即JwtAccessTokenConverter。但是此时,我们并没有配置accessTokenConverter。所以tokenEnhancer便为空。从而造成DefaultTokenServices中的token返回便会直接普通token。
解决
如上述分析,解决问题之关键在于,配置accessTokenConverter。配置如下:
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.accessTokenConverter(jwtAccessTokenConverter())
.tokenStore(new JwtTokenStore(jwtAccessTokenConverter()));
;
}
重启系统,再次访问授权接口,此时,已正常返回jwt类型的token。
本文系【银河架构师】原创,如需转载请在文章明显处注明作者及出处。
微信搜索【银河架构师】,发现更多精彩内容。
技术资料领取方法:关注公众号,回复微服务,领取微服务相关电子书;回复MK精讲,领取MK精讲系列电子书;回复JAVA 进阶,领取JAVA进阶知识相关电子书;回复JAVA面试,领取JAVA面试相关电子书,回复JAVA WEB领取JAVA WEB相关电子书。