基于Token签名验证机制的一种鉴权机制;
JJWT 签名后的token分为三部分:
1.header:一般做声明
{
'typ': 'JWT',
'alg': 'HS256'
}
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
2.pyload: 所有自定义参数与一些标准声明信息的载体
iss: jwt签发者
sub: 主题
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 生效时间
iat: 签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
- 自定义的参数
3.signature
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
将这三部分用.连接成一个完整的字符串,构成了最终的jwt
JWT 简单应用
/**
* token 用户信息签名
*/
@Test
public void signWith() throws ParseException {
final String signWith = Jwts.builder() /* 进行签名 */
.setId("张三") /* 可以新增一个唯一Id用于声明不同签名 */
.setSubject("主题") /* 新增一个主题 */
.setIssuedAt(new Date()) /* 当前签名时间 */
.setHeaderParam("header_key","header_value") /* JWT中头部的信息 就是header */
.claim("usna","as123") /* 在 pyLoad 载体中自定义的参数 */
.claim("pawd","asdzxc123") /* 在 pyLoad 载体中自定义的参数 */
.setExpiration(new SimpleDateFormat("yyyy-MM-dd").parse("2019-12-30")) /* 设置签名到期时间 */
.signWith(SignatureAlgorithm.HS256, PRIVATE_SECRET) /* 指定加密的算法 指定签名的私钥 需要确保私钥不能泄露 */
.compact(); /* 编译 */
System.out.println(signWith);
}
@Test
public void parseSecret(){
String secret="eyJoZWFkZXJfa2V5IjoiaGVhZGVyX3ZhbHVlIiwiYWxnIjoiSFMyNTYifQ.eyJqdGkiOiLlvKDkuIkiLCJpYXQiOjE1NzQzNDY3MzcsInVzbmEiOiJhczEyMyIsInBhd2QiOiJhc2R6eGMxMjMiLCJleHAiOjE1Nzc2MzUyMDB9.u47Nahf8XiY-l0gbG0J-rizKKNmfJ7JycocP8MdfzA8";
final Jws<Claims> claimsJws = Jwts.parser() /* 获得一个解析对象 */
.setSigningKey(PRIVATE_SECRET) /* 设置 secret 私钥 */
.parseClaimsJws(secret); /* 进行解析 并获得Claims pyLoad 自定义数据集*/
final Claims body = claimsJws.getBody();
body.forEach((key, value) -> System.out.println(key+"---"+value));
}