# 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();
        }
    }