学习地址:
https://www.majiaxueyuan.com/uc/play/65
Oauth2.0的一些简单介绍:
https://blog.csdn.net/qq_28198181/article/details/100523474
目录
1.JWT简介
2.JWT组成部分
2.增强TOKEN配置
3.授权服务启动
1.JWT简介
(白嫖网站)https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=pc
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。
2.JWT组成部分
三个部分组成:
JWT的三个部分如下。JWT头、有效载荷和签名
JWT头
JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。
{
"alg": "HS256",
"typ": "JWT"
}
在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。
最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
有效载荷
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。
签名哈希
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
JWT的用法
客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。
此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。
Authorization: Bearer
当跨域时,也可以将JWT被放置于POST请求的数据主体中。
为什么使用JWT替换原有TOKEN:JWT可以携带用户自定义信息
2.增强TOKEN配置
1.在https://blog.csdn.net/qq_28198181/article/details/100523474
配置的代码基础上添加增强token的方法
在AuthorizationServerConfig类上进行
// JWT
@Bean
public JwtAccessTokenConverter accessTokenJwtConverter() {
JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter() {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
// 这里的UserName是OpenId
String username = authentication.getUserAuthentication().getName();
// 得到用户名,去处理数据库可以拿到当前用户的信息和角色信息(需要传递到服务中用到的信息)
final Map<String, Object> addToJWTInformation = new HashMap<>();
JSONObject json = new JSONObject();
json.put("userId", 1); //这里直接写死的
json.put("userName", username); //直接写死的
addToJWTInformation.put("localUser", json.toJSONString());
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(addToJWTInformation);
OAuth2AccessToken enhancedToken = super.enhance(accessToken, authentication);
return enhancedToken;
}
};
accessTokenConverter.setSigningKey("yyy-sign-key");// 测试用,资源服务使用相同的字符达到一个对称加密的效果
return accessTokenConverter;
}
然后在配置授权和令牌点的配置方法中添加这个方法
//定义授权和令牌端点和令牌服务
public void configure(AuthorizationServerEndpointsConfigurer endpointsConfigurer){
//刷新令牌时需要的认证管理和用户信息来源
endpointsConfigurer.authenticationManager(authenticationManager()).allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST);
endpointsConfigurer.authenticationManager(authenticationManager());
endpointsConfigurer.userDetailsService(userDetailsService());
//配置增强TOKEN
endpoints.accessTokenConverter(accessTokenJwtConverter());
}
然后重启启动授权服务
3.授权服务启动
启动后 通过密码形式获得token试试
可以得到如下:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ1c2VyXzEiLCJzY29wZSI6WyJhbGwiXSwiZXhwIjoxNTY4MTA1MTQ3LCJsb2NhbFVzZXIiOiJ7XCJ1c2VyTmFtZVwiOlwidXNlcl8xXCIsXCJ1c2VySWRcIjoxfSIsImF1dGhvcml0aWVzIjpbIlJPTEVfVVNFUiJdLCJqdGkiOiIzNDQxNGUzMi01Y2VlLTRmNGQtYjFmYy02ZjU5NzFkYTMzYWUiLCJjbGllbnRfaWQiOiJ5eXlfY2xpZW50In0.-FnJ5NIV7O3NMJvPVKyuCmUQnYA-0YBGd33Ye-t8VPc",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ1c2VyXzEiLCJzY29wZSI6WyJhbGwiXSwiYXRpIjoiMzQ0MTRlMzItNWNlZS00ZjRkLWIxZmMtNmY1OTcxZGEzM2FlIiwiZXhwIjoxNTY4MTA1NDQ3LCJsb2NhbFVzZXIiOiJ7XCJ1c2VyTmFtZVwiOlwidXNlcl8xXCIsXCJ1c2VySWRcIjoxfSIsImF1dGhvcml0aWVzIjpbIlJPTEVfVVNFUiJdLCJqdGkiOiJiYjU3NjFkYy1lYzYwLTQzOGQtYmEzYS0xNzE5NjIzYWExNTIiLCJjbGllbnRfaWQiOiJ5eXlfY2xpZW50In0.uo8v4NkwngdQBVkelsLmQ13307jLWUDAe05jZWXMzsM",
"expires_in": 6899,
"scope": "all",
"localUser": "{\"userName\":\"user_1\",\"userId\":1}",
"jti": "34414e32-5cee-4f4d-b1fc-6f5971da33ae"
}
第一个是获取的token值
第二个是token的类型,一般都是bearer
第三个是可以刷新token的
第四个是token存在的时间 秒单位
第四个是授权作用域
第五个附加信息的json串 这里附带了用户信息
第六个是JWT ID用于标识该JWT
通过该TOKNE去访问资源服务器:
(token访问资源服务器:https://blog.csdn.net/qq_28198181/article/details/100669548)
可以看到是访问到了资源服务的方法的
以上