java使用JWT
什么都干的派森 人气:0一、简介
JWT是token的一种,一个JWT字符串包含三个部分
1.Header
头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型
{ "alg": "HS256", // 指定签名算法 "typ": "JWT" // 指定token令牌类型 }
2.Payload
包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息
iss: 发行人
exp: 到期时间
sub: 主题
aud: 用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID用于标识该JWT
3.Signature
数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】
iss: 发行人 exp: 到期时间 sub: 主题 aud: 用户 nbf: 在此之前不可用 iat: 发布时间 jti: JWT ID用于标识该JWT
4.组合
最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT
Header.Payload.Signature
二、封装类
1.引入依赖
<!-- jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency>
2.封装方法
package com.cxstar.utils; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.JWTVerifier; import java.util.Calendar; import java.util.Map; public class JwtUtil { // 签名密钥 private static final String SECRET = "hello JWT *%$#$&"; /** * 生成token * @param payload token携带的信息 * @return token字符串 */ public static String generateToken(Map<String,String> payload){ // 指定token过期时间 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, 24); // 24小时 JWTCreator.Builder builder = JWT.create(); // 构建payload payload.forEach(builder::withClaim); // 指定过期时间和签名算法,并返回token String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET)); return token; } /** * 解析token * @param token token字符串 * @return 解析后的token类 */ public static DecodedJWT decodeToken(String token){ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); DecodedJWT decodedJWT = jwtVerifier.verify(token); return decodedJWT; } }
三、使用方法
package com.cxstar; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.DecodedJWT; import com.cxstar.utils.JwtUtil; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; import java.util.Map; @SpringBootTest class JwtLoginApplicationTests { @Test void tokenTest() { // 根据用户信息生成令牌 -------------------------- Map<String, String> payload = new HashMap<>(); payload.put("userId", "233"); payload.put("userName", "ps"); String token = JwtUtil.generateToken(payload); System.out.println("token: " + token); // -------------------------------------------- // 解析令牌并获取用户信息 ------------------------------------------------ try { DecodedJWT decodedJWT = JwtUtil.decodeToken(token); String userId = decodedJWT.getClaim("userId").asString(); String userName = decodedJWT.getClaim("userName").asString(); String exp = decodedJWT.getExpiresAt().toString(); System.out.println("userId: " + userId); // 取出自定义属性【用户id】 System.out.println("userName: " + userName); // 取出自定义属性【用户名】 System.out.println("exp: " + exp); // 取出默认属性【过期时间】 } catch (JWTDecodeException e) { System.out.println("令牌错误"); } catch (TokenExpiredException e) { System.out.println("令牌过期"); } // ------------------------------------------------------------------- } }
ps:最后附一篇写的很详细的JWT文章https:
加载全部内容