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

时间:2018-06-28 06:54:27

标签: java kotlin jwt vert.x

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

{
  "keys": [
    {
      "kty": "RSA",
      "kid": "JRcO4nxs5jgc8YdN7I2hLO4V_ql1bdoiMXmcYgHm4Hs",
      "n": "z8fZsz...GHSTAoQw",
      "e": "AQAB"
    }
  ]
}

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

答案 1 :(得分:0)

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

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

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

然后我用

        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”

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