JWT如何创建和校验呢?
下文笔者讲述JWT创建和校验的方法及示例分享
JWT简介
JWT是一种紧凑的
URL安全的用于两端传递的声明
在JWS的结构中,JWT的声明会被加密成一个JSON对象
当做payload
他们会使这些声明被数字化签名
或被消息认证码(类似散列)/加密算法完整地保护
JWT构造
JWT分为三段数据
分别是head/payload/sign
每段数据采用.号连接
jwtToken =
base64url(header Json串) + . +
base64url(payload Json串) + . +
加密算法(base64url(header Json串) + . +
base64url(payload Json串), 秘钥)
以HMACSHA256加密算法为例
header:
{
"alg": "HS256",
"typ": "JWT"
}
payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
sign:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), secret)
创建token
long currentTime = System.currentTimeMillis();
long exp = currentTime + 1000*60;// 设置有效时间为1分钟
// 创建JwtBuilder对象
JwtBuilder jwtBuilder = Jwts.builder()
// 唯一ID:{"jti": "888"}
.setId("888")
// 主体:用户{"sub":"Rose"}
.setSubject("Rose")
// 创建日期{“ita”: ""}
.setIssuedAt(new Date())
// 签名
// 参数1: 算法
// 参数2: 盐
.signWith(SignatureAlgorithm.HS256, "XXXX")
// 设置失效时间
.setExpiration(new Date(exp));
// 获取token
String token = jwtBuilder.compact();
System.out.println(token);
// Base64解密
String[] split = token.split("\\.");
System.out.println(Base64Codec.BASE64.decodeToString(split[0]));// 头部
System.out.println(Base64Codec.BASE64.decodeToString(split[1]));// 载荷
// 无法解密
System.out.println(Base64Codec.BASE64.decodeToString(split[2]));
解析token
String token = "ey*******************************";
// 解析token获取负载中的声明对象
Claims claims = (Claims) Jwts.parser()
// 密钥必须要与加密时候一致
.setSigningKey("XXXX")
.parse(token)
.getBody();
System.out.println("ID => " + claims.getId());
System.out.println("sub => " + claims.getSubject());
System.out.println("date => " + claims.getIssuedAt());
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


