在何处获取用于验证Java或Kotlin中的JWT令牌的公钥

Where to get Public key for validating a JWT Token in Java or Kotlin

我在后端使用Vertx的Kotlin,并且从One Login获得身份验证后,前端将JWT令牌转发给我。现在,我要确保令牌有效而不是假的(伪造的)。如果我点击以下链接,它表示我需要一个公共密钥才能创建JWTAuth对象,该对象可用于调用身份验证进行验证。
https://vertx.io/docs/vertx-auth-jwt/kotlin/

我需要知道在哪里可以获取公钥?


我不了解OneLogin,但是从他们的文档中,我可以看到它们是SAML / OpenId Connect提供程序,因此可以轻松地从其配置中检索公钥。根据他们的文档,您可以从以下位置找到您的实例配置:

1
https://<subdomain>.onelogin.com/oidc/.well-known/openid-configuration

从该文件中,您应该查找键jwks_uri,该键将具有类似https://acme.onelogin.com/oidc/certs的值。如果获得此URL,则将具有类似于以下内容的JSON:

1
2
3
4
5
6
7
8
9
10
{
 "keys": [
    {
     "kty":"RSA",
     "kid":"JRcO4nxs5jgc8YdN7I2hLO4V_ql1bdoiMXmcYgHm4Hs",
     "n":"z8fZsz...GHSTAoQw",
     "e":"AQAB"
    }
  ]
}

此文件是JSON Web密钥(链)。可以将此JSON提要给JWTAuth,以加载密钥并进行所需的验证。作为3.6的补充说明,在OAuth2模块中将提供适当的OpenId Connect Discovery支持,这意味着您不再需要为此烦恼了,只要您的提供程序和所有内容都可以正确配置,就只需传递URL即可。


非常感谢您提出的重点答复。我能够访问JSON Web密钥,并且也将其输入到JWTAuth.create中,现在JWTCreate不会引发任何异常。但是,即使我使用的是从前端发送的经过身份验证的JWT令牌,provider.authenticate始终无法对其进行身份验证。

我使用以下方法创建JWTAuth对象。

1
2
       var jsonObject = JsonObject("<I Copied all contents of Json Web Key here.>")
       var provider = JWTAuth.create(myvertx, jsonObject)

然后我用

1
2
3
4
5
6
7
8
9
10
        var idJson = JsonObject()
        idJson.put("jwt", myJWTToken)

        var optionsJson = JsonObject()
        optionsJson.put("ignoreExpiration",true)

        idJson.put("options", optionsJson)

        provider.authenticate(idJson, { asyncresult ->
            println("Is authenticated = ${asyncresult.succeeded()}")

})

但是当我尝试使用Vertx方式通过PubSecKeyOptions和JWTAuthOptions提供公钥时,通过从OneLogin证书URL复制密钥,它抛出了一个异常,说" InvalidKeyException"

1
2
3
4
5
6
7
Caused by: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=71, too big.
at sun.security.x509.X509Key.decode(X509Key.java:398)
at sun.security.x509.X509Key.decode(X509Key.java:403)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:86)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
... 51 more