根据已有的JWK Set 验证jwt的有效性
根据jwt 和认证中心获取的jwk set 认证jwttoken的有效性
实现步骤
1.解析JWK Set JSON字符串:从给定的JSON字符串中解析出JWK Set。
2.解析JWT Token:解析给定的JWT Token。
3.提取JWT头部信息和密钥ID:获取JWT头部中的密钥ID。
4.查找匹配的JWK:根据密钥ID在JWK Set中找到对应的JWK。
5.转换为RSA密钥:将找到的JWK转换为RSA密钥。
6.验证JWT:使用RSA公钥验证JWT的有效性。
7. 检查过期时间:如果JWT验证通过,则检查JWT的过期时间是否已到,并输出相应结果。
依赖
<!-- 使用nimbus库解析jwt. 相对于常用的jjwt依赖库可操作性更强--->
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.40</version>
</dependency>
代码逻辑
public static void main(String[] args) throws ParseException, JOSEException {
// 替换成你自己的认证中心获取的jwt 字符串
String jwkSetJson = "{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "a91e5f62dcb42",
"alg": "RS256",
"n": "qL4xxxxxxxxxxxxxxxxxxxxxxxxxxoQ"
},
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "9f4c0815",
"alg": "RS256",
"n": "vWwwwwwwwwwwwwwwwww2w0"
}
]
}";
// 换成你自己的token 字符串
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTcyNzA5NDg0NiwibmJmIjoxNzI3MDk0ODQ2LCJleHAiOjE3MjcxODEyNDZ9.WX4Dvt1x7KIl4FIk20nG5qj3zxBR60zeqUGRGZkCti0";
// Parse the JWKS string
JWKSet jwkSet = JWKSet.parse(jwkSetJson);
// Parse the JWT
SignedJWT signedJWT = SignedJWT.parse(token);
// Extract the JWT header and key ID
JWSHeader header = signedJWT.getHeader();
String keyId = header.getKeyID();
// Find the matching JWK
JWK jwk = jwkSet.getKeyByKeyId(keyId);
if (jwk == null) {
throw new RuntimeException("JWK not found for key ID: " + keyId);
}
// Convert JWK to RSA key
RSAKey rsaKey = jwk.toRSAKey();
RSASSAVerifier verifier = new RSASSAVerifier((RSAPublicKey) rsaKey.toPublicKey());
// Verify the JWT,没有篡改jwt
boolean isValid = signedJWT.verify(verifier);
// 认证jwt有效时间内
if (isValid) {
JWTClaimsSet claims = signedJWT.getJWTClaimsSet();
Date date = (Date) claims.getClaim("exp");
if (date.compareTo(new Date())>0){
System.out.println("有效期内");
}else {
System.out.println("过期了");
}
} else {
System.out.println("失败");
}
}