1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.vincent.rsf.openApi.security.utils;
 
import com.vincent.rsf.openApi.entity.app.App;
import com.vincent.rsf.openApi.entity.constant.Constants;
import com.vincent.rsf.openApi.service.AppService;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.apache.tika.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import javax.annotation.Resource;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;
 
/**
 * JWT Token工具类
 * 用于生成和验证JWT Token
 */
public class TokenUtils {
    private static final Logger log = LoggerFactory.getLogger(TokenUtils.class);
    
    // 使用一个安全的密钥,实际应用中应该从配置文件读取
    private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    
    // Token过期时间,默认1小时
    private static final long TOKEN_EXPIRATION = 60 * 60 * 1000L; // 24小时
 
    @Resource
    private AppService appService;
 
    /**
     * 生成JWT Token
     * 
     * @param claims Token中包含的声明信息
     * @return 生成的Token字符串
     */
    public static String generateToken(Map<String, Object> claims) {
        long now = System.currentTimeMillis();
        Date expiration = new Date(now + TOKEN_EXPIRATION);
 
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(expiration)
                .signWith(SECRET_KEY, SignatureAlgorithm.HS256)
                .compact();
    }
 
    /**
     * 生成带AppId的Token
     * 
     * @param appId 应用ID
     * @param appSecret 应用秘钥
     * @return 生成的Token字符串
     */
    public static String generateToken(String appId, String appSecret) {
        Map<String, Object> claims = Map.of(
            "appId", appId,
            "appSecret", appSecret,
            "created", System.currentTimeMillis()
        );
        return generateToken(claims);
    }
 
    /**
     * 解析Token获取声明信息
     * 
     * @param token Token字符串
     * @return 声明信息
     */
    public static Claims parseToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(SECRET_KEY)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (JwtException e) {
            log.error("解析Token失败: {}", e.getMessage());
            return null;
        }
    }
 
    /**
     * 验证Token时间是否有效
     * 
     * @param token Token字符串
     * @return 时间是否有效
     */
    public static boolean validateTokenTime(String token) {
        try {
            Claims claims = parseToken(token);
            if (claims == null) {
                return false;
            }
            
            // 检查Token是否过期
            Date expiration = claims.getExpiration();
            return expiration != null && expiration.after(new Date());
        } catch (JwtException e) {
            log.error("验证Token失败: {}", e.getMessage());
            return false;
        }
    }
 
    /**
     * 从Token中获取AppId
     * 
     * @param token Token字符串
     * @return AppId
     */
    public static String getAppIdFromToken(String token) {
        Claims claims = parseToken(token);
        if (claims != null) {
            return (String) claims.get("appId");
        }
        return null;
    }
 
    /**
     * 从Token中获取appSecret
     *
     * @param token Token字符串
     * @return appSecret
     */
    public static String getSecretFromToken(String token) {
        Claims claims = parseToken(token);
        if (claims != null) {
            return (String) claims.get("appSecret");
        }
        return null;
    }
 
//    /**
//     * 从Token中获取UserId
//     *
//     * @param token Token字符串
//     * @return UserId
//     */
//    public static String getUserIdFromToken(String token) {
//        Claims claims = parseToken(token);
//        if (claims != null) {
//            return (String) claims.get("userId");
//        }
//        return null;
//    }
 
    /**
     * 从Authorization头中提取Token
     * 
     * @param authHeader Authorization头内容
     * @return Token字符串(不包含Bearer前缀)
     */
    public static String extractTokenFromHeader(String authHeader) {
        if (authHeader != null && authHeader.startsWith(Constants.TOKEN_PREFIX)) {
            return authHeader.substring(Constants.TOKEN_PREFIX.length()).trim();
        }
        return null;
    }
}