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 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 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; } }