JWT JWK RSA 实现认证jwt有效性

根据已有的JWK Set 验证jwt的有效性

根据jwt 和认证中心获取的jwk set 认证jwttoken的有效性

实现步骤

1.解析JWK Set JSON字符串:从给定的JSON字符串中解析出JWK Set2.解析JWT Token:解析给定的JWT Token3.提取JWT头部信息和密钥ID:获取JWT头部中的密钥ID4.查找匹配的JWK:根据密钥IDJWK Set中找到对应的JWK5.转换为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("失败");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值