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());
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。