要创建一个JWT,可以使用Java的javax.crypto
库来进行加密和解密操作,而不使用nimbusds
库。以下是一个示例代码,用于创建和验证JWT:
import java.security.Key;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JWTExample {
private static final String ALGORITHM = "RSA";
public static void main(String[] args) {
// 生成公私钥对
KeyPairGenerator keyPairGenerator;
try {
keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Failed to generate key pair", e);
}
keyPairGenerator.initialize(2048);
Key privateKey = keyPairGenerator.generateKeyPair().getPrivate();
Key publicKey = keyPairGenerator.generateKeyPair().getPublic();
// 创建JWT
String token = createJWT(privateKey);
System.out.println("JWT: " + token);
// 验证JWT
boolean isValid = verifyJWT(token, publicKey);
System.out.println("JWT is valid: " + isValid);
}
private static String createJWT(Key privateKey) {
Map claims = new HashMap<>();
claims.put("username", "john.doe");
claims.put("role", "admin");
// 生成JWT的header
Map header = new HashMap<>();
header.put("alg", "RS256");
header.put("typ", "JWT");
// 设置JWT的有效期为1小时
long nowMillis = System.currentTimeMillis();
long expMillis = nowMillis + 3600000;
Date exp = new Date(expMillis);
// 生成JWT的payload
String jwtPayload = Base64.getUrlEncoder().withoutPadding().encodeToString(claims.toString().getBytes());
// 生成JWT的signature
String signature;
try {
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign((PrivateKey) privateKey);
signer.update(jwtPayload.getBytes());
byte[] signatureBytes = signer.sign();
signature = Base64.getUrlEncoder().withoutPadding().encodeToString(signatureBytes);
} catch (Exception e) {
throw new RuntimeException("Failed to create JWT signature", e);
}
// 生成JWT
String jwt = Base64.getUrlEncoder().withoutPadding().encodeToString(header.toString().getBytes())
+ "." + jwtPayload + "." + signature;
return jwt;
}
private static boolean verifyJWT(String jwt, Key publicKey) {
String[] parts = jwt.split("\\.");
// 验证JWT的header和payload
String header = new String(Base64.getUrlDecoder().decode(parts[0]));
String payload = new String(Base64.getUrlDecoder().decode(parts[1]));
System.out.println("JWT Header: " + header);
System.out.println("JWT Payload: " + payload);
// 验证JWT的signature
String signature = parts[2];
try {
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify((PublicKey) publicKey);
verifier.update((parts[0] + "." + parts[1]).getBytes());
byte[] signatureBytes = Base64.getUrlDecoder().decode(signature);
return verifier.verify(signatureBytes);
} catch (Exception e) {
throw new RuntimeException("Failed to verify JWT signature", e);
}
}
}
上述代码使用RSA算法生成公私钥对,然后使用私钥创建JWT,并使用公钥验证JWT的有效性。JWT的格式为header.payload.signature
,其中header和payload分别是Base64编码的JSON字符串,signature是通过使用私钥对header和payload进行签名后得到的Base64编码字符串。
上一篇:不使用逆矩阵的回归系数标准误差
下一篇:不使用匿名函数创建函数适配器