依赖引入

<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.18.1</version>
</dependency>

我使用的是auth0的jwt包。

令牌的生成

public String generateJwtToken(Long userId, Integer level){
        Algorithm algorithm = Algorithm.HMAC256(salt);
        Date now = new Date();
        String token = JWT.create()
                .withIssuedAt(now)
                .withClaim("userId", userId)
                .withClaim("level", level)
                .withExpiresAt(getExpiredDate(now))
                .sign(algorithm);
        return token;
    }

令牌的生成如以上代码所示,首先指定算法(需要使用一个随机字符串作为salt),之后调用链中withIssuedAt()设置签发时间;withClaim()设置token中携带的参数,可以是用户名等信息;withExpiresAt()设置token到期的时间点。

令牌解密

public Map<String, Claim> decodeToken(String jwtToken){
        Algorithm algorithm = Algorithm.HMAC256(salt);
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
        try {
            DecodedJWT decodedJWT = jwtVerifier.verify(jwtToken);
            return decodedJWT.getClaims();
        }catch (Exception e){
            e.printStackTrace();
            log.error("校验令牌失败");
            throw new UnAuthenticatedException(10004);
        }
    }

解密时使用的算法与salt与加密保持一致,之后调用JWTVerifier的verify()方法解密得到DecodedJWT对象,它的getClaims()方法用于获得加密时设置的参数组成的Map。Map的key为名称,Claim类的asInt()、asLong()等方法用于将参数根据类型导出,类型注意保持与加密时一致。如果token不正确或到期verify()方法会抛出异常。

03-05 15:21