JAVA-JWT学习笔记

JAVA-JWT学习–com.auth0的学习笔记

1. pom.xml关于java-jwt依赖配置

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

2.编写JWT的token生成和验证代码样例

例子中采用的时HMAC265的方式进行加密,其他加密方式可以参考官方github的加密方法去修改。其他的一些接口可以参考官方文档java-jwt API文档的链接

package com.wms.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.auth0.jwt.exceptions.JWTVerificationException;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

public class JwtUtils {

    // 密钥,用于签名和验证JWT
    private static final String SECRET = "secret";

    // JWT的发行者、主题和受众------------------这部分可以不设置
    private static final String ISSUER = "auth0";
    private static final String SUBJECT = "1234567890";
    private static final String AUDIENCE = "app";

    // JWT的有效期(1小时)
    private static final Integer EXPIRATION_TIME_IN_HOUR = 1;

    // 生成JWT的方法
    public static String generateJwt(Integer userId, String userName) {
        //初始化实例
        JWTCreator.Builder JWTBuilder = JWT.create();
        //设置Jwt的发行者 主题 受众 可以不设置
        JWTBuilder.withIssuer(ISSUER);
        JWTBuilder.withSubject(SUBJECT);
        JWTBuilder.withAudience(AUDIENCE);
        //设置过期时间 预设一个token过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.HOUR,EXPIRATION_TIME_IN_HOUR);//过期时间为1小时
        JWTBuilder.withExpiresAt(calendar.getTime());
        //Header
        HashMap<String, Object> map = new HashMap<>();
        map.put("test", "test");
        JWTBuilder.withHeader(map);
        //PayLoad
        JWTBuilder.withClaim("UserId", userId);
        JWTBuilder.withClaim("UserName", userName);
        //设置JWT的签发时间
        JWTBuilder.withIssuedAt(new Date());
        // 设置JWT的生效时间(通常与签发时间相同)
        JWTBuilder.withNotBefore(new Date(System.currentTimeMillis()));
        // 使用HMAC256算法和SECRET密钥对JWT进行签名
        return JWTBuilder.sign(Algorithm.HMAC256(SECRET));
    }

    // 验证JWT的方法
    public static boolean verifyJwt(String token) {
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET))
                    .withIssuer(ISSUER)
                    .withSubject(SUBJECT)
                    .withAudience(AUDIENCE)
                    .build();// 构建JWTVerifier实例
            DecodedJWT jwt = verifier.verify(token);
            System.out.println("header"+jwt.getHeader());
            System.out.println("payload UserId: " + jwt.getClaim("UserId"));
            System.out.println("payload UserName: " + jwt.getClaim("UserName"));
            return true; // 验证成功
        } catch (JWTVerificationException exception) {
            // 处理验证失败
            System.out.println("Invalid token: " + exception.getMessage());
            return false; // 验证失败
        }
    }

    public static void main(String[] args) {
        // 生成JWT
        Integer userId = 1;
        String userName = "admin";
        String token = generateJwt(userId,userName);
        System.out.println("Generated Token: " + token);

        // 验证JWT
        boolean isValid = verifyJwt(token);
        System.out.println("Token is valid: " + isValid);

        // 测试无效的JWT
        String invalidToken = token.substring(0, token.length() - 1) + "X"; // 假设最后一个字符被修改了
        boolean isInvalid = verifyJwt(invalidToken);
        System.out.println("Invalid Token is valid: " + isInvalid);
    }
}

运行结果截图
在这里插入图片描述

3.1 验证异常结果抛出

上述的样例中采用的时JWTVerificationException进行抛出,具体的样例抛出设置的类还有如下图所示:
在这里插入图片描述
可以根据需要设置不同的异常抛出,然后根据不同的异常进行不同的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值