Token工具类
[👉 源码](https://github.com/geniusay/Assistant)
<dependency>
<groupId>io.github.geniusay</groupId>
<artifactId>assistant-boot-start</artifactId>
<version>1.1.1</version>
</dependency>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# TokenUtil
简述
一款token自动生成,解析工具,目前包含Token的基本功能以及refresh-token功能 关于什么是Token (opens new window)
# 配置
TokenUtil 内部的配置由JWTTokenProperties决定
属性名 | 类型 | 默认值 | 描述 |
---|---|---|---|
accessTokenName | String | accessToken | token名字 |
accessTokenExpireTime | String | 30 | 访问token过期时间 |
accessTokenTimeUnit | String | MINUTES | token过期时间单位(请全部大写,采用TimeUnit的时间单位格式) |
enableRefresh | Boolean | false | 是否开启刷新token |
refreshTokenName | String | refreshToken | token名字 |
refreshTokenExpireTime | String | 24 | 刷新token过期时间 |
refreshTokenTimeUnit | String | HOURS | refresh-token过期时间单位(请全部大写,采用TimeUnit的时间单位格式) |
tokenSecret | String | cuAihCz53DZRjZwbsGcZJ2Ai6At+T142uphtJMsk7iQ= | token密钥 |
isRandomJIT | Boolean | false | 是否随机生成jti |
以上这些配置均可再yml文件中配置,格式如下⬇
assistant:
token:
access-token-expire-time: 3600
access-token-time-unit: SECONDS
enable-refresh: true
1
2
3
4
5
2
3
4
5
# 使用
# 初始化
@Autowired
TokenUtil tokenUtils;
class User{
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
User user = new User("Genius",18);
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 创建Token
创建Token有许多方式,这里一一来介绍一下,在使用TokenUtils时,会根据你的参数返回一个Token类,Token类中包含了Access-Token等等信息,接下来 我们帮上述的User对写封装到Token中
1,单个payload Token创建
//Token<T> createToken(String payloadName,T payload,String subject) payload名称,payload,公共部分
String token = tokenUtils.createToken("user",user,"123456").getAccessToken();
1
2
2
2,多个payload Token创建
//Token<T> createToken(Map<String,Object> payload,String subject)
String token2 = tokenUtils.createToken(Map.of("user",user,"ID","123456"),"123456").getAccessToken();
1
2
2
3,详细Token创建
/*
* 创建token
* @param header 头部
* @param claims 私有部分,不建议存放私密信息
* @param iat jwt签发时间
* @param exp jwt过期时间
* @param nbf jwt生效时间
* @param iss jwt签名者
* @param sub 公共部分
* @param jti jwt唯一身份标识,jti
* @param audience 发布人
* @param isRefresh 是否刷新token
*/
Claims claims = Jwts.claims();
claims.put("user",user);
String token3 = tokenUtils.createToken(
Map.of("type","jwt","alg","HS256"), //token头信息
claims, //token payload
new Date(), //token签发时间
new Date(new Date().getTime() + 60*1000), //token过期时间
new Date(new Date().getTime() + 120*1000), //token刷新时间,如果未启用则无效
new Date(new Date().getTime()), //Token生效时间
"Genius", //token签名者
"public Path", //公共区域
tokenUtils.getJwtTokenProperties().getJit(), //token唯一身份标识
"Genius", //发布人
true //是否需要进行刷新操作
).getAccessToken();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 解析Token
注意
解析Token函数目前不具备自动刷新access-token的功能,如果你想实现refresh功能,请搭配refreshToken使用
解析Token有多种方法以及返回类型
方法名 | 返回类型 | 参数 | 方法描述 |
---|---|---|---|
parseToken | Claims | String(token字符串) | 直接返回Claims主体(不推荐直接使用) |
parseTokenToObj | 泛型T | String(token字符串),String(需要获取的payload名称),Class(转换的类型) | 解析Token返回payload中的对象 |
parseTokenToToken | Token | String(token字符串),String(需要获取的payload名称),Class(转换的类型) | 解析access-token并返回Token对象 |
Token<User> token1 = tokenUtils.parseTokenToToken(token, "user", User.class);
User user = tokenUtils.parseTokenToObj(token, "user", User.class);
1
2
2
# 刷新Token
简述
关于refresh-token的使用,access-token作为一个短期token,refresh-token作为一个长期token,如果refresh-token还没过期,
但是access-token 已经过期,那么就会返回一个新的access-token,如果refresh-token也过期了就说明用户证书已过期需要重新鉴权登录
再次我们把access-token设为10ms过期,启动后,tokenUtils会自动将其刷新并提示内容已经刷新
@Test
public void tesReFreshToken(){
User user = new User("Genius",18);
Claims claims = Jwts.claims();
claims.put("user",user);
Token<User> token = tokenUtils.createToken(
Map.of("type","jwt","alg","HS256"), //token头信息
claims, //token payload
new Date(), //token签发时间
new Date(new Date().getTime() + 10), //token过期时间
new Date(new Date().getTime() + 120*1000), //token刷新时间,如果未启用则无效
new Date(new Date().getTime()), //Token生效时间
"Genius", //token签名者
"public Path", //公共区域
tokenUtils.getJwtTokenProperties().getJit(), //token唯一身份标识
"Genius", //发布人
true //是否需要进行刷新操作
);
System.out.println(token.getAccessToken());
System.out.println(tokenUtils.refreshToken(token).getAccessToken());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 输出
2023-04-04 20:44:39.836 INFO 37416 --- [ main] c.genius.assistant.util.token.TokenUtil : refresh token is disable,if you want to enable it,please set JWTTokenProperties.EnableRefreshToken to true
2023-04-04 20:44:55.934 INFO 37416 --- [ main] c.genius.assistant.util.token.TokenUtil : access-token is expire,refreshing!
1
2
2
更多例子可查看test包下面的samples
- TokenUtilsTest (opens new window)
帮助我们改善此页面! (opens new window)
上次更新: 2024/06/22, 16:36:11