Tch
Tch
Published on 2024-10-26 / 38 Visits
0
1

Spring Boot项目中使用JWT生成Token

Token

Token是一种广泛使用的身份验证机制,它代表了一种凭证,通常用于在客户端和服务端之间传递身份验证信息。通常在http请求头中包含token用以验证身份,并在请求结束后返回一个新的token并交由客户端保存。

使用JWT生成Token

Token的形式是多种多样的,生成的方式也具有很多选择性,如何选择取决于应用场景和技术需求。

JWT(Json Web Tokens)具有无状态性、安全性、易于集成等优点,这里选择使用JWT来生成Token。

pom.xml文件中引入JWT的依赖

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>4.4.0</version>
</dependency>

新建一个Token工具类TokenUtils

package cool.tch.util;

/**
 * @author denchouka
 * @description TODO
 * @date 2024/10/26 21:07
 */
public class TokenUtils {

    /**
     * 生成token
     * @param username 用户名
     * @param ip 用户的ip
     * @return 生成的token
     */
    public static String token(String username, String ip) {
        return null;
    }


    /**
     * 校验token
     * @param token 请求头中携带的token
     * @return 校验结果
     */
    public static boolean verify(String token) {
        return false;
    }
}

生成token的方法

/**
 * 生成token
 * @param username 用户名
 * @param ip 用户的ip
 * @return 生成的token
 */
public static String token(String username, String ip) {
    // 参数校验
    if (StringUtils.isBlank(username) || StringUtils.isBlank(ip)) {
        throw new BusinessException("用户名和ip不能为空");
    }

    // Header
    HashMap<String, Object> header = new HashMap<>(2);
    // Token类型
    header.put("typ","JWT");
    // 签名算法类型
    header.put("alg","HS256");

    try{
        // 生成token签名
        return JWT.create()
                .withHeader(header)
                // 添加声明
                .withClaim("username", username)
                .withClaim("ip", ip)
                .withClaim("time", Instant.now())
                // 加盐
                .withClaim("salt", Constant.TOKEN_SECRET_SALT)
                // 1H后过期
                .withExpiresAt(Date.from(Instant.now().plusSeconds(Constant.TOKEN_EXPIRE_DATE)))
                // 密钥
                .sign(Algorithm.HMAC256(Constant.TOKEN_SECRET_KEY));
    } catch (Exception e) {
        throw new BusinessException("生成token失败");
    }
}

校验token的方法

/**
 * 校验token
 * @param token 请求头中携带的token
 * @return 校验结果
 */
public static boolean verify(String token) {

    // 判空
    if (StringUtils.isBlank(token)) {
        return false;
    }

    // 验证token有效性
    try{
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(Constant.TOKEN_SECRET_KEY)).build();
        verifier.verify(token);
        return true;
    } catch (JWTVerificationException e) {
        return false;
    }
}

写在最后

以上生成和校验token方法的实现方式不是固定的,可根据自己的业务场景灵活实现。如果项目中使用了Redis等还可以将token存入缓存中,在服务端也保存token。


Comment