jwt生产token和校验token

需要注意的是:如果过期时间你总是以当前时间+3000(约定的过期时间),那么程序每次启动时这个时间是不同的,所以每次生成的token也是不一样的,如果想生成一直不变的token,请把起始时间写死,如1970-1-1,下面的例子起始时间是2022年,但是向后token的有效期最多有60年(以十年为单位测试的)

 1 @Slf4j
 2 public class JWTUtil {
 3     /**
 4      * 生产token
 5      * @param api_key 约定
 6      * @param api_secret 约定
 7      * @param time token过期时间,毫秒
 8      */
 9     public static String generateToken(String api_key, String api_secret, Long time){
10         String token = null;
11         try {
12             //设置token过期时间 :如果想每次生成的token一样,这里的起始时间就写死
13             //Date date = new Date(System.currentTimeMillis()+time);
14             Date date = new Date(DateUtil.strToDate("2022-11-11").getTime()+time);
15             //设置加密算法
16             Algorithm algorithm = Algorithm.HMAC256(SALT);
17             //设置头部
18             /**
19              * {
20              *  “type”: “JWT”, 声明类型,这里是jwt
21              *  “alg”: “HS256” 声明加密的算法 通常直接使用 HMAC SHA256
22              * }
23              */
24             Map<String ,Object> headers = new HashMap<>();
25             headers.put(HEADS_TYPE_KEY,HEADS_TYPE_VALUE);
26             headers.put(HEADS_ALGORITHM_KEY,HEADS_ALGORITHM_VALUE);
27             //生产token
28             token = JWT.create()
29                     .withClaim(API_KEY,api_key)
30                     .withClaim(API_SECRET,api_secret)
31                     .withExpiresAt(date)
32                     .sign(algorithm);
33         } catch (Exception e) {
34             log.info(e.getMessage());
35         }
36         return token;    }
37     /**
38      * 校验token
39      * @param token 需要校验的token
40      */
41     public static boolean verification(String token){
42         try {
43             //根据盐获取加解密算法
44             Algorithm algorithm = Algorithm.HMAC256(SALT);
45             //获取解密对象
46             JWTVerifier jwtVerifier = JWT.require(algorithm).build();
47             //解密
48             DecodedJWT decodedJWT = jwtVerifier.verify(token);
49             //获取客户信息
50             log.info("api_key:"+decodedJWT.getClaim(API_KEY).asString());
51             log.info("api_key:"+decodedJWT.getClaim(API_SECRET).asString());
52             return true;
53         }catch (Exception e){
54             log.info(e.getMessage());
55             return false;
56         }
57     }
58     //测试
59     public static void main(String[] args) throws Exception {
60         //过期时间60年
61         String token = JWTUtil.generateToken("ZhuanAn", "zhuanan2022", 60*12*31*24*60*60 * 1000L);
62         log.info("================成功获取token==================="+token);
63         boolean result = JWTUtil.verification("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcGlfa2V5IjoiWmh1YW5BbiIsImV4cCI6MTcwMDIzNjgwMCwiYXBpX3NlY3JldCI6InpodWFuYW4yMDIyIn0.Ze82ZNQdsKCS_FY1kZiRWs-Qx8plc2lOQW7itILQUhs");
64         log.info("================token校验结果============"+result);
65     }
66 }

jwt中的一些常量封装

public class JWTConstant {
    private JWTConstant(){}

    public static final String API_KEY = "api_key";
    public static final String API_SECRET = "api_secret";
    public static final String HEADS_TYPE_KEY = "type";
    public static final String HEADS_TYPE_VALUE = "jwt";
    public static final String HEADS_ALGORITHM_KEY = "alg";
    public static final String HEADS_ALGORITHM_VALUE = "HS256";
    public static final String AUTH_HEAD = "Authentication";
    public static final String SALT = "AWER@#$@";
}

 

posted @ 2022-08-09 14:24  sg夜游神  阅读(427)  评论(0编辑  收藏  举报