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 |
从该文件中,您应该查找键
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模块中将提供适当的
非常感谢您提出的重点答复。我能够访问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 |