JWT 对称加密
JWT将 相关信息放在 令牌里
jwt全称 JSON Web Token。这个实现方式不用管如何进行存储(内存或磁盘),
因为它可以把相关信息数据编码存放在令牌里
。JwtTokenStore 不会保存任何数据,
但是它在转换令牌值以及授权信息方面与 DefaultTokenServices 所扮演的角色是一样的。
安全性
OAuth2提供了JwtAccessTokenConverter实现,添加jwtSigningKey,以此生成秘钥,以此进行签名,只有jwtSigningKey才能获取信息。
认证服务器
/**
* 对Jwt签名时,增加一个密钥
* JwtAccessTokenConverter:对Jwt来进行编码以及解码的类
*/
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("test-secret");
return converter;
}
/**
* 设置token 由Jwt产生,不使用默认的透明令牌
*/
@Bean
public JwtTokenStore jwtTokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.tokenStore(jwtTokenStore())
.accessTokenConverter(accessTokenConverter())
.allowedTokenEndpointRequestMethods(HttpMethod.GET,
HttpMethod.POST);
资源服务器
security:
oauth2:
resource:
user-info-uri: http://localhost:9098/users/current
jwt:
key-value: test-secret
认证
http://localhost:9098/oauth/token?grant_type=authorization_code&code=ABB3bH&client_id=client_2&client_secret=123456&redirect_uri=http://www.baidu.com
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI5MTIyOTIsInVzZXJfbmFtZSI6InVzZXJfMSIsImF1dGhvcml0aWVzIjpbIlVTRVIiXSwianRpIjoiZDgwODZjMDEtYzczZi00ODgzLTgzODctMDBiYjBmZTY1MGY5IiwiY2xpZW50X2lkIjoiY2xpZW50XzIiLCJzY29wZSI6WyJhbGwiXX0.nQfDpO5fIZ5BJQr8FyxPkqosHRMxPDhMFjyimIC5FNg",
"token_type": "bearer",
"expires_in": 604799,
"scope": "all",
"jti": "d8086c0