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