如何在Java中使用令牌和公钥验证JWT签名

如何在Java中使用令牌和公钥验证JWT签名,java,jwt,Java,Jwt,我有一个字符串形式的令牌,我下载了公共证书并用它创建了一个公钥,如下所示 但我不知道如何用这么多的信息进行验证 我找到了C#和.NET的解决方案,但没有找到Java的解决方案。 请注意,我没有jks文件或私钥 FileInputStream fin = new FileInputStream("d://public.crt"); CertificateFactory f = CertificateFactory.getInstance("X.509"); X509Cert

我有一个字符串形式的令牌,我下载了公共证书并用它创建了一个公钥,如下所示

但我不知道如何用这么多的信息进行验证

我找到了C#和.NET的解决方案,但没有找到Java的解决方案。 请注意,我没有jks文件或私钥

    FileInputStream fin = new FileInputStream("d://public.crt");
    CertificateFactory f = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate)f.generateCertificate(fin);
    PublicKey pk = certificate.getPublicKey();

如果您询问JSON WebToken,您可以遵循以下代码示例:

import javax.xml.bind.DatatypeConverter;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;

//Sample method to validate and read the JWT
private void parseJWT(String jwt) {

    //This line will throw an exception if it is not a signed JWS (as expected)
    Claims claims = Jwts.parser()         
       .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
       .parseClaimsJws(jwt).getBody();
    System.out.println("ID: " + claims.getId());
    System.out.println("Subject: " + claims.getSubject());
    System.out.println("Issuer: " + claims.getIssuer());
    System.out.println("Expiration: " + claims.getExpiration());
}

要进一步阅读,您可以访问,单击以使用Auth0库(com.Auth0:Java JWT)验证Java中的JWT:

  • 检索密钥已签名的算法,例如:

    // Load your public key from a file
    final PublicKey ecdsa256PublicKey = getPublicKey(...);
    final Algorithm algorithm = Algorithm.ECDSA256((ECPublicKey) ecdsa256PublicKey, null);
    
  • 使用相应的算法验证其签名:

    final DecodedJWT decodedJWT = JWT.decode("J.W.T[...]");
    // Will throw a SignatureVerificationException if the token's signature is invalid
    algorithm.verify(decodedJWT);
    

  • 我这样做是为了验证JWT

    try {
            DecodedJWT decodedJWT = JWT.decode(jwt); // your string
            JwkProvider provider =  new JwkProviderBuilder(new URL("JWKS URL")).build();
            Jwk jwk = provider.get(decodedJWT.getKeyId());
            Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
    
            Verification verifier = JWT.require(algorithm);
            verifier.build().verify(decodedJWT);
        } catch (JWTVerificationException | JwkException | MalformedURLException e) {
            // throw your exception
        }
    

    JwkProviderBuilder
    可能很昂贵,因此如果使用Spring,可以将其提取为另一种方法,并使用
    @PostConstruct
    对其进行注释以优化

    什么对象是apiKey?如果我只有一个公钥证书文件,我如何获取它的机密。apiKey是com.stormpath.sdk.api.apiKey的对象,用于保存apiKey。String path=“resources/.stormpath/apiKey.properties”;ApiKey ApiKey=ApiKeys.builder().setFileLocation(path.build();这不是回答用户的问题。使用密钥验证使用的是HS256(hmac),而使用公钥验证的是RS256。我已经尝试过了,程序在第行“provider.get(decodedJWT.getKeyId())”处被tuck。您得到的错误是什么?您确定要传递的JWT或JWKs URL是正确的吗?