JwtUtils.java

package com.yumu.noveltranslator.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtils {

    private String secret;
    private Long expireTime;

    @Value("${jwt.secret}")
    public void setSecret(String secret) {
        this.secret = secret;
    }

    @Value("${jwt.expiration:2592000000}") // 默认 30 天 (单位毫秒)
    public void setExpireTime(Long expireTime) {
        this.expireTime = expireTime;
    }

    /**
     * 生成 Token
     * @param userId   用户 ID
     * @param email   用户邮箱
     * @param tenantId 租户 ID
     * @return String
     */
    public String createToken(Long userId, String email, Long tenantId) {
        Date date = new Date(System.currentTimeMillis() + expireTime);
        Algorithm algorithm = Algorithm.HMAC256(secret);

        return JWT.create()
                .withClaim("userId", userId)
                .withClaim("email", email)
                .withClaim("tenantId", tenantId)
                .withIssuedAt(new Date())
                .withExpiresAt(date)
                .sign(algorithm);
    }

    /**
     * 生成 Token(向后兼容,使用 userId 作为 tenantId)
     */
    public String createToken(Long userId, String email) {
        return createToken(userId, email, userId);
    }

    /**
     * 校验并解码 Token
     * @param token 客户端传来的 Token
     * @return DecodedJWT 如果验证失败会抛出异常
     */
    public DecodedJWT verifyToken(String token) {
        Algorithm algorithm = Algorithm.HMAC256(secret);
        JWTVerifier verifier = JWT.require(algorithm).build();
        return verifier.verify(token);
    }

    /**
     * 获取 Token 中的用户信息
     */
    public Map<String, String> getUserInfoFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        Map<String, String> info = new HashMap<>(2);
        info.put("userId", jwt.getClaim("userId").asLong().toString());
        info.put("email", jwt.getClaim("email").asString());
        return info;
    }

    /**
     * 从 Token 中获取用户 ID
     */
    public Long getUserIdFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        return jwt.getClaim("userId").asLong();
    }

    /**
     * 从 Token 中获取用户邮箱
     */
    public String getEmailFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        return jwt.getClaim("email").asString();
    }

    /**
     * 从 Token 中获取租户 ID
     */
    public Long getTenantIdFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        return jwt.getClaim("tenantId").asLong();
    }

    /**
     * 从 Token 中获取过期时间
     */
    public java.time.LocalDateTime getExpiresAtFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        Date expiresAt = jwt.getExpiresAt();
        return expiresAt.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime();
    }
}