JwtUtil.java
3.05 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
package com.taover.bazhuayun.analysis.web.permission;
import java.io.IOException;
import java.security.Key;
import java.util.Date;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletException;
import javax.xml.bind.DatatypeConverter;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
* Reserved claims(保留),它的含义就像是编程语言的保留字一样,属于JWT标准里面规定的一些claim。JWT标准里面定好的claim有:
iss(Issuser):代表这个JWT的签发主体;
sub(Subject):代表这个JWT的主体,即它的所有人;
aud(Audience):代表这个JWT的接收对象;
exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;
nbf(Not Before):是一个时间戳,代表这个JWT生效的开始时间,意味着在这个时间之前验证JWT是会失败的;
iat(Issued at):是一个时间戳,代表这个JWT的签发时间;
jti(JWT ID):是JWT的唯一标识。
* @param req
* @param res
* @param chain
* @throws IOException
* @throws ServletException
*/
public class JwtUtil {
public static String TOKEN_PREFFIX = "Bearer==";
public static int TOKEN_START_INDEX = TOKEN_PREFFIX.length();
private static Audience audience = new Audience();
private static JwtParser jwtParser;
private static JwtBuilder jwtBuilder;
static {
//生成签名密钥
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(audience.getBase64Secret());
//初始化jwtParser
jwtParser = Jwts.parser().setSigningKey(apiKeySecretBytes);
//初始化jwtBuilder
Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
jwtBuilder = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setIssuer(audience.getName())
.setAudience(audience.getClientId())
.signWith(SignatureAlgorithm.HS256, signingKey);
}
/**
* 解析jwt
*/
public static BzyClaims parseJWT(String token) {
Claims claims = jwtParser.parseClaimsJws(token).getBody();
Long userid = Long.valueOf(claims.get("userid", Object.class).toString());
Long tenantId = Long.valueOf(claims.get("tenant", Object.class).toString());
return new BzyClaims(claims,tenantId,userid);
}
/**
* 构建jwt
*/
public static String createJWT(String mobile, Long userId, Long tenantId) {
//添加构成JWT的参数
jwtBuilder.claim("tenant", tenantId.toString())
.claim("username", mobile)
.claim("userid", userId.toString());
//添加Token过期时间
if (audience.getExpiresSecond() >= 0) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
Date exp = new Date(nowMillis + audience.getExpiresSecond()*1000);
jwtBuilder.setExpiration(exp).setNotBefore(now);
}
//生成JWT
return jwtBuilder.compact();
}
}