SAToken 是什么?以下是一个简单的 Java SAToken 示例,其中包括生成 SAToken 和验证 SAToken 的代码:
```java import java.util.Base64; import java.util.Date; import java.util.Map; import java.util.HashMap; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec;
public class SAToken { private static final String HMAC_ALGORITHM = "HmacSHA256"; private static final String SEPARATOR = "."; private static final String SEPARATOR_SPLITTER = "\.";
// 生成 SAToken
public static String generate(Map<String, Object> claims, String secret) {
String[] parts = new String[2];
try {
String header = new String(Base64.getUrlEncoder().encode(
"{\"alg\":\"HS256\",\"typ\":\"JWT\"}".getBytes("UTF-8")));
String payload = new String(Base64.getUrlEncoder().encode(
JSONObject.toJSONString(claims).getBytes("UTF-8")));
parts[0] = header;
parts[1] = payload;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return createToken(parts, secret);
}
// 验证 SAToken
public static Map<String, Object> verify(String token, String secret) {
try {
String[] parts = token.split(SEPARATOR_SPLITTER);
byte[] decodedSignature = Base64.getUrlDecoder().decode(parts[2]);
Mac hmac = Mac.getInstance(HMAC_ALGORITHM);
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), HMAC_ALGORITHM);
hmac.init(secretKey);
byte[] signingInput = (parts[0] + SEPARATOR + parts[1]).getBytes("UTF-8");
byte[] expectedSignature = hmac.doFinal(signingInput);
if (!Arrays.equals(decodedSignature, expectedSignature)) {
throw new Exception("Token signature does not match");
}
Map<String, Object> result = JSONObject.parseObject(new String(Base64.getUrlDecoder().decode(parts[1]), "UTF-8"), Map.class);
Date expirationTime = new Date((Long) result.get("exp") * 1000);
if (expirationTime.before(new Date())) {
throw new Exception("Token has expired");
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 创建 SAToken
private static String createToken(String[] parts, String secret) {
try {
Mac hmac = Mac.getInstance(