From 69a3c374ca3afb770e3b9ffcbdda07ce362cbf58 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期五, 09 一月 2026 19:59:29 +0800
Subject: [PATCH] #

---
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/security/utils/TokenUtils.java |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 161 insertions(+), 0 deletions(-)

diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/security/utils/TokenUtils.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/security/utils/TokenUtils.java
new file mode 100644
index 0000000..cbadad0
--- /dev/null
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/security/utils/TokenUtils.java
@@ -0,0 +1,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宸ュ叿绫�
+ * 鐢ㄤ簬鐢熸垚鍜岄獙璇丣WT 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 鐢熸垚鐨凾oken瀛楃涓�
+     */
+    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();
+    }
+
+    /**
+     * 鐢熸垚甯ppId鐨凾oken
+     * 
+     * @param appId 搴旂敤ID
+     * @param appSecret 搴旂敤绉橀挜
+     * @return 鐢熸垚鐨凾oken瀛楃涓�
+     */
+    public static String generateToken(String appId, String appSecret) {
+        Map<String, Object> claims = Map.of(
+            "appId", appId,
+            "appSecret", appSecret,
+            "created", System.currentTimeMillis()
+        );
+        return generateToken(claims);
+    }
+
+    /**
+     * 瑙f瀽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("瑙f瀽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;
+            }
+            
+            // 妫�鏌oken鏄惁杩囨湡
+            Date expiration = claims.getExpiration();
+            return expiration != null && expiration.after(new Date());
+        } catch (JwtException e) {
+            log.error("楠岃瘉Token澶辫触: {}", e.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * 浠嶵oken涓幏鍙朅ppId
+     * 
+     * @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;
+    }
+
+    /**
+     * 浠嶵oken涓幏鍙朼ppSecret
+     *
+     * @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;
+    }
+
+//    /**
+//     * 浠嶵oken涓幏鍙朥serId
+//     *
+//     * @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;
+//    }
+
+    /**
+     * 浠嶢uthorization澶翠腑鎻愬彇Token
+     * 
+     * @param authHeader Authorization澶村唴瀹�
+     * @return Token瀛楃涓诧紙涓嶅寘鍚獴earer鍓嶇紑锛�
+     */
+    public static String extractTokenFromHeader(String authHeader) {
+        if (authHeader != null && authHeader.startsWith(Constants.TOKEN_PREFIX)) {
+            return authHeader.substring(Constants.TOKEN_PREFIX.length()).trim();
+        }
+        return null;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1