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