JwtTokenUtil.java
4.89 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package isa.qa.utils;
import io.jsonwebtoken.*;
import isa.qa.core.AuthenticationFailedException;
import isa.qa.properties.JwtProperties;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* JSON WEB TOKEN 工具类
*
* @author May
* @version 1.0
* @date 2018/5/6 14:40
*/
@Component
@AllArgsConstructor
public class JwtTokenUtil {
private static final String CLAIM_KEY_USERNAME = "sub";
private static final String CLAIM_KEY_CREATED = "created";
private final JwtProperties jwtProperties;
/**
* 从Token中解析出App key
*
* @param token token值
*/
public String getAppKeyFromToken(String token) throws AuthenticationFailedException {
String username;
final Claims claims = getClaimsFromToken(token);
username = claims.getSubject();
return username;
}
/**
* 从Token从解析出Token的生成日期
*
* @param token 原始token
*/
public Date getCreatedDateFromToken(String token) throws AuthenticationFailedException {
Date created;
final Claims claims = getClaimsFromToken(token);
created = new Date((Long) claims.get(CLAIM_KEY_CREATED));
return created;
}
/**
* 利用JWT及设置的过期时长从Token中计算出过期的时间
*
* @param token 原始token
*/
public Date getExpirationDateFromToken(String token) throws AuthenticationFailedException {
Date expiration;
final Claims claims = getClaimsFromToken(token);
expiration = claims.getExpiration();
return expiration;
}
/**
* 从token中解析出所有的相关的参数
*/
private Claims getClaimsFromToken(String token) throws AuthenticationFailedException {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(jwtProperties.getSecret())
.parseClaimsJws(token)
.getBody();
} catch (ExpiredJwtException e) {
throw new AuthenticationFailedException("登录凭证失效了,请重新登录");
} catch (SignatureException e) {
throw new AuthenticationFailedException("登录凭证有误");
}
return claims;
}
/**
* 计算得到的即刻生成的Token的过期时间
*/
private Date generateExpirationDate(Integer hours) {
return new Date(System.currentTimeMillis() + (hours * 3600) * 1000);
}
/**
* 校验token是否过期了
*
* @param token 校验的token
*/
private Boolean isTokenExpired(String token) throws AuthenticationFailedException {
final Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
/**
* 判断Token是否是在上次密码变更前所生成的
*
* @param created 创建时间
* @param lastPasswordReset 上次密码重置时间
*/
private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
return (lastPasswordReset != null && created.before(lastPasswordReset));
}
/**
* 设置生成Token的组合参数
*
* @param userDetails 用户信息
*/
public String generateToken(String appKey, Integer hours) {
Map<String, Object> claims = new HashMap<>(2);
claims.put(CLAIM_KEY_USERNAME, appKey);
claims.put(CLAIM_KEY_CREATED, new Date());
return generateToken(claims, hours);
}
/**
* 根据组合参数生成Token
*
* @param claims 组合参数
* @param hours
*/
String generateToken(Map<String, Object> claims, Integer hours) {
return Jwts.builder()
.setClaims(claims)
.setExpiration(generateExpirationDate(hours))
.signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
.compact();
}
/**
* 根据Token是否是上次密码更换前所生成的来决定Token是否可以刷新
*
* @param token 原始token
* @param lastPasswordReset 上次更新密码时间
*/
public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset)
throws AuthenticationFailedException {
final Date created = getCreatedDateFromToken(token);
return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset)
&& !isTokenExpired(token);
}
/**
* 通过解析原始token换取新的token
*
* @param token 原始token
*/
public String refreshToken(String token, Integer hours) throws AuthenticationFailedException {
String refreshedToken;
final Claims claims = getClaimsFromToken(token);
claims.put(CLAIM_KEY_CREATED, new Date());
refreshedToken = generateToken(claims, hours);
return refreshedToken;
}
}