spring security oauth2搭建resource-server demo及token改造成JWT令牌 (2)

使用哪一种授权方式都是可以的,在前面一节我们使用了授权码方式进行获取:https://www.cnblogs.com/process-h/p/15688971.html。在这里我们使用密码授权方式进行获取token,启动授权服务后,我们访问获取token端点:

:53020/uaa/oauth/token?client_id=c1&client_secret=secret&grant_type=password&username=hyz&password=hyz

spring security oauth2搭建resource-server demo及token改造成JWT令牌

2、查看token代表了哪些信息

​ spring security oauth2 中有个用于资源服务访问的令牌解析端点(/oauth/check_token )。我们先来看看上面返回的token中都有哪些权限,访问

:53020/uaa/oauth/check_token?token=c46ffcf5-3043-4513-9405-808f89b02f30

spring security oauth2搭建resource-server demo及token改造成JWT令牌

​ 可以看到返回以下属性信息:

第三方client的基本信息:user_name\client_Id\scope

第三方client的授权列表:authorities

第三方client的资源服务列表:res1

如果我们传入一个不存在的token,那么将会返回

{ "error": "invalid_token", "error_description": "Token was not recognised" } 3、使用token访问资源服务

​ 最后我们再来使用该token访问资源服务。oauth2.0 要求将token根据具体的格式放在请求头中:Authorization: Bearer token

spring security oauth2搭建resource-server demo及token改造成JWT令牌

​ 如上图,资源服务在接收到token参数后,会到授权服务的/oauth/check_token端点拿到该token的权限,然后与资源服务定义的授权进行比对,如果符合就继续执行,否则返回

{ "error": "invalid_token", "error_description": "c46ffcf5-3043-4513-9405-808f89b02f301" } JWT令牌

​ 通过上面的测试,当资源服务和授权服务不在一起时,资源服务需要通过网络请求去授权服务的/token/check_token端点请求验证token,如果访问量较大将会影响系统的性能。

​ 为了解决性能问题,可以将token令牌采用jwt格式,这样用户授权后通过后将会拿到一个JWT令牌,JWT令牌中已经包含了用户相关的信息,包括权限,基本信息等,接着资源服务根据事先跟认证服务约定好的算法自行进行令牌校验,无需每次都想认证服务请求验证。

​ JWT具体是什么,相信童鞋们也有一定的认识了,这里不过多说明。主要说明一点,一般JWT是是用非对称加密使用的,在这里我们使用对称加密的方式,省去非对称加密密钥生成步骤。

1、配置认证服务JWT令牌

​ 在认证服务中配置JWT令牌,即可实现生成JWT格式的令牌。

TokenConfig ,修改tokenService的实现类。

@Configuration public class TokenConfig { private String SIGNING_KEY = "uaa123"; @Bean public TokenStore tokenStore() { return new JwtTokenStore(accessTokenConverter()); } @Bean public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey(SIGNING_KEY); //对称秘钥,资源服务器使用该秘钥来验证 return converter; } }

定义使用JWT令牌

public class AuthorizationServer extends AuthorizationServerConfigurerAdapter { @Autowired private JwtAccessTokenConverter accessTokenConverter; @Bean public AuthorizationServerTokenServices tokenService() { DefaultTokenServices service=new DefaultTokenServices(); service.setClientDetailsService(clientDetailsService); service.setSupportRefreshToken(true); // 定义使用JWT令牌 service.setTokenStore(tokenStore); TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter)); service.setTokenEnhancer(tokenEnhancerChain); service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时 service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天 return service; } }

检验令牌,根据密码授权模式来获取令牌:

spring security oauth2搭建resource-server demo及token改造成JWT令牌

​ 由上图可见,生成的令牌确实已经是JWT的格式了。

​ 再查看该令牌中代表了哪些信息。访问

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfgyy.html