如何使用PEM格式的RSA公钥解码JWT令牌?

迈克·张伯伦

我的Java应用程序正在接收JWT。我有PEM格式的公钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixn0CGu8/M4txn4pdp8K
m8RQfVa+cHX25/a5sPmzP49u7YlQsRvtOexzgdwDcfUJm3hHMZcbZBtrHKsS8q4Q
QtGQioyVml8EaLuFNFYisaIEldVyRbXFG54FNp03vSU9ImS/cOiM9swo+1w5JgWO
F9efy7JO40LA9E7lv64COUYjFhrn+HRZuKoblL19+Sj49FyXexAUS29UM9PfIdY6
ar1FA8cxzPqW7EkXZ0Mua3IzNnYcjMvUL9TJwoLAAz9S1Tv4Is5jupy9UXkuJ4r8
Jx9DqI3Q3ur0VekYSd5tnTI4K+no9ABCFVv7+6Q45Ec2eB0xMwlqI+phcGhGMVCX
1QIDAQAB
-----END PUBLIC KEY-----

我知道我可以使用JwtConsumer来验证和解码JWT:

JwtConsumer jwtConsumer = new JwtConsumerBuilder()
    .setRequireExpirationTime()
    .setVerificationKey(publicKey) // what do I pass here?
    .build();

但是,如何将PEM文件转换为可以理解的格式.setVerificationKey()

布莱恩·坎贝尔

在v0.5.0中,有一些实用程序支持处理PEM编码的公钥RsaKeyUtil.fromPemEncoded(String pem),这可能会为您简化一些事情。您还可以直接从JwtClaims对象获取索赔值,这也可能会简化。这是您的示例,并做了一些细微的修改:

    String jwt = "eyJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6Ik1DaGFtYmU0IiwiZXhwIjoxNDU2OTEwODgzLCJzY29wZSI6WyJvcGVuaWQiLCJwMnAiLCJociIsImRhcyIsIm1lIl0sImNsaWVudF9pZCI6Im1vYmlsZSIsImp0aSI6ImNZcHBMYXltVzlmNXFBZk4ifQ.QqZI9vV8IznTjN-GtUSCri9-6HH6Yl1Oae6K8-d2yjQ4fysF5d3wStdL2kMazl7xeqbtSIsw-F5Aol9eHdGAu54b9IyBEM_QIasy0lnT8xFk0Zi36NJ-7yhl_89f6SB6TGimM59xUvzXxuAw3FzWM6TbiptInrCL2TXkhS69Gng-ANPeiSITUX5A1TDInssds6ZoSb7IOUMtxPGfrbO9sBjx8aJlIu9igkqk4OX5xBmxLp3icoo98I5v9Wt_Huu7eWKBfOskMSEav4X_m5_phbAZJ_F8nWRmcxk6O7hCQdawzegnhMxP2IPIhwlWRNX_8WxkNErq2fJgdazDf8pS_Q";

    // read public key from a file or config or something
    String publicKeyPEM =
            "-----BEGIN PUBLIC KEY-----\n" +
            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAixn0CGu8/M4txn4pdp8K\n" +
            "m8RQfVa+cHX25/a5sPmzP49u7YlQsRvtOexzgdwDcfUJm3hHMZcbZBtrHKsS8q4Q\n" +
            "QtGQioyVml8EaLuFNFYisaIEldVyRbXFG54FNp03vSU9ImS/cOiM9swo+1w5JgWO\n" +
            "F9efy7JO40LA9E7lv64COUYjFhrn+HRZuKoblL19+Sj49FyXexAUS29UM9PfIdY6\n" +
            "ar1FA8cxzPqW7EkXZ0Mua3IzNnYcjMvUL9TJwoLAAz9S1Tv4Is5jupy9UXkuJ4r8\n" +
            "Jx9DqI3Q3ur0VekYSd5tnTI4K+no9ABCFVv7+6Q45Ec2eB0xMwlqI+phcGhGMVCX\n" +
            "1QIDAQAB\n" +
            "-----END PUBLIC KEY-----";

    RsaKeyUtil rsaKeyUtil = new RsaKeyUtil();
    PublicKey publicKey = rsaKeyUtil.fromPemEncoded(publicKeyPEM);

    // create a JWT consumer
    JwtConsumer jwtConsumer = new JwtConsumerBuilder()
            .setRequireExpirationTime()
            .setVerificationKey(publicKey)
            .build();

    // validate and decode the jwt
    JwtClaims jwtDecoded = jwtConsumer.processToClaims(jwt);
    String username = jwtDecoded.getStringClaimValue("username"); // "MChambe4"

    // ensure the required scope is claimed
    String requiredScope = "das";
    List<String> scopes = jwtDecoded.getStringListClaimValue("scope");
    if (!scopes.stream().anyMatch(scope -> scope.equals(requiredScope))) {
        throw new Exception("Required scope is not claimed: " + requiredScope);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 openssl 命令解码公钥 .PEM 文件?

来自分类Dev

如何将原始模数和指数转换为RSA公钥(.pem格式)

来自分类Dev

将RSA公钥转换为PEM格式

来自分类Dev

将RSA公钥转换为PEM格式

来自分类Dev

如何使用OpenSSL从.cer中提取RSA公钥并将其存储在.pem中?

来自分类Dev

如何使用 rsa 公钥验证文件

来自分类常见问题

如何以.pem格式保存证书中的公钥

来自分类Dev

使用.pem格式的公钥在Xcode中进行签名验证

来自分类Dev

Node JS JWT使用Google的公钥验证令牌

来自分类Dev

无法BER解码RSA公钥

来自分类Dev

使用DER格式的RSA公钥文件的iOS加密

来自分类Dev

生成 PEM 格式的公钥/私钥对

来自分类Dev

使用Java将RSA公钥导出到PEM字符串

来自分类Dev

Android Java-使用RSA公钥.PEM加密字符串

来自分类Dev

如何使用ssh-rsa公钥加密文本?

来自分类Dev

如何从 Android Studio 中的文本视图解码 RSA 公钥(在 Java 中)

来自分类Dev

使用Java将ASN1序列解码为RSA公钥

来自分类Dev

如何获取Pem文件的公钥?

来自分类Dev

如何将SSH公钥从PEM转换为DER格式?

来自分类Dev

jwt.io在哪里从JWT令牌获取公钥?

来自分类Dev

无法DER编码和BER解码RSA公钥

来自分类Dev

在 C++ 中通过 openSSL 使用公钥验证 JWT 令牌时出现分段错误

来自分类Dev

如何存储 RSA 私钥、公钥

来自分类Dev

(Erlang)以Pem格式从证书中提取公钥

来自分类Dev

PHP OpenSSL无法读取PEM格式的公钥

来自分类Dev

使用现有公钥的RSA加密

来自分类Dev

使用OpenSSL生成RSA公钥/私钥?

来自分类Dev

登录后如何使用passport-jwt解码令牌

来自分类Dev

使用Pem证书解码ruby / jwt