JWT实战

1. 使用方式

这里使用maven配置进行JWT的整合,首先看Maven配置:

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

创建一个简单的JWT测试,并使用静态秘钥进行加密:

public static void main(String[] args) {
        JWTCreator.Builder builder = JWT.create();
        // 你可以在这里放任何你想放置的文本
        Map<String, String> claimMap = new HashMap<>();
        claimMap.put("name", "小猴子的技术笔记");
        claimMap.forEach(builder::withClaim);
        // 设置一小时之后过期
        builder.withExpiresAt(new Date(System.currentTimeMillis() + 3600000L));
        Algorithm algorithm = Algorithm.HMAC256("#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
        String sign = builder.sign(algorithm);
        System.out.println(sign);
    }

得到结果:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak

可以看到结果就是按照"."进行分割组成的,一共三个部分。我们找个在线解析JWT的工具,把我们生成的数据放进去看看:

image-20240606162253194

可以看到我们的JWT能够成功的被解析出来,palyload中的内容也被展示出来,因此比较重要的信息千万不要放在palyload中,因为他并不是安全的。

2. 验证JWT的合法性

public static void main(String[] args) {
    Algorithm algorithm = Algorithm.HMAC256("#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
    DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
    System.out.println(verify);
}

通过debug模式能够看到已经成功解析出来:

image-20240606163028630

这里解析填写了我们的秘钥,因为是静态的秘钥,因此我们千万不能够泄露这个秘钥,否则我们的Token也就不安全了。

我们把秘钥估计写错几位,看看会产生什么情况:

public static void main(String[] args) {
        Algorithm algorithm = Algorithm.HMAC256("333#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
        DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
        System.out.println(verify);
    }

image-20240606163316156

这里抛出了一个叫做SignatureVerificationException 的异常信息,结合我们之前预先讲过的JWT可能会抛出的异常中的第2个:签名异常。我们可以使用try-catch的方式捕获这个异常然后进行我们的业务处理:

public static void main(String[] args) {
    try {
        Algorithm algorithm = Algorithm.HMAC256("333#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
        DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
        System.out.println(verify);
    } catch (SignatureVerificationException signatureVerificationException) {
        signatureVerificationException.printStackTrace();
        System.out.println("签名异常");
    }
}

image-20240606163556338

其他的异常也是使用类似的方法进行捕获,然后自定义业务处理逻辑即可。上面的例子只是简单的演示了一下如何使用,在实际的生产中我们更多的是把他封装成一个工具类来进行使用。