写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。
上一篇记录了使用jwt令牌和自定义token携带的信息,本篇继续完善一下令牌的解析和使用refresh_token获取令牌,本篇代码基于上一篇:使用Spring Security OAuth2使用JWT生成token及自定义token携带的信息(十)
目录
Java解析JWT内容
pom依赖
测试类
Postman测试
刷新令牌
环境
Postman测试
Java解析JWT内容
这里我们使用jjwt的工具包解析JWT的内容。
pom依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
测试类
@GetMapping(value = "/jwt")
public Object jwt(HttpServletRequest request) {
String authorization = request.getHeader("Authorization");
return Jwts.parser()
.setSigningKey("abc123".getBytes(StandardCharsets.UTF_8))
.parseClaimsJws(authorization)
.getBody();
}
Postman测试
启动我们之前的认证服务和测试服务。
首先,获取token,如下:
localhost:9005/oauth/token?client_id=dev-client&client_secret=123456&grant_type=password&username=zhangsan&password=123456
结果如下:
然后,我们访问JWT解析测试方法 http://localhost:9000/jwt,如下:
结果如下:
如上,已经JWT的内容已经解析出来了。
刷新令牌
下面演示一下token失效时使用refresh_toekn重新获取token的过程。
环境
我们的客户端信息是保存在数据库的,要想支持刷新令牌,注意oauth_client_details表中authorized_grant_types要包含refresh_token,另外,之前令牌的有效期和刷新令牌的有效期是配置在令牌服务中的,如下:
tokenServices.setAccessTokenValiditySeconds(60);
tokenServices.setRefreshTokenValiditySeconds(3600);
这里咱们配置在数据库oauth_client_details表中,后续客户端信息会做一个管理功能来维护这些信息,为了演示,这里还将令牌有效期设置为30秒,刷新令牌的有效期设置为3600秒,如下:
Postman测试
使用上面的token再次访问 访问JWT解析测试方法 http://localhost:9000/jwt,结果如下:
后台报错信息如下:
io.jsonwebtoken.ExpiredJwtException: JWT expired at 2023-03-09T09:56:55Z. Current time: 2023-03-09T10:08:47Z, a difference of 712101 milliseconds. Allowed clock skew: 0 milliseconds.
如上,JWT expired,使用refresh_token重新获取token,如下:
结果如下:
使用新获取的access_token再次访问 JWT解析测试方法 http://localhost:9000/jwt,就可以在再次访问了。