如何更改由Keycloak OpenID Connect Java适配器生成的身份验证网址?

时间:2018-11-07 15:39:57

标签: openid-connect keycloak

我们将Keycloak Java适配器4.5.0与EAP7.1结合使用。在配置keycloak.json时,我们为auth-server-url提供了URL https://authentication.country.com/op/v1/auth。到目前为止一切顺利。

导航到应用程序时,我们将转发到https://authentication.country.com/op/v1/auth/realms/KeycloakOIDCRealm/protocol/openid-connect/auth?response_type=code&client_id=fac9d161-d27d-493d-uze896zed78&redirect_uri=....

这不好,因为我们使用自己的身份提供者。删除URL的realms/KeycloakOIDCRealm/protocol/openid-connect/部分,将其正确转发到身份提供者。因此,假设我们将始终使用Keycloak作为身份提供者,则Keycloak适配器默认情况下会添加它。在我们使用SAML之前,没有这个问题。

我们如何为适配器配置keycloak.json而不添加realms/KeycloakOIDCRealm/protocol/openid-connect/

1 个答案:

答案 0 :(得分:1)

我联系了Keycloak的支持人员,他们的回答如下:

  

你好Fabrizio,

     

事实上,字符串模板(例如“ / realms / {realm-name} / protocol / openid-connect / auth”)被硬编码到Keycloak适配器中。

     

幸运的是,似乎有一种解决方法。在Keycloak中,有一种多租户机制。它需要您提供一个解析器,该解析器将根据请求参数返回KeycloakDeployment实例。   它的一项额外功能是,您可以完全重新定义KeycloakDeployment的行为。例如,您可以扩展org.keycloak.adapters.KeycloakDeployment并覆盖其resolveUrls()方法,以使URL指向您的第三方IDP。

     

这种方法不需要对适配器代码进行任何修改,因此建议您从它开始。但是,我不排除可能会出现的不兼容问题。

     

另一种选择是安装中间密钥库(服务器),将代理配置为第三方IDP,并将适配器指向密钥库。虽然听起来有些过分,但它是一种防弹解决方案,应该可以100%起作用(并且还有其他一些好处)。

     

当然,还有其他选项,例如使用等效于Keycloak适配器的第三方IDP,使用其他OpenID Connect Java库,甚至使用代理级适配器,例如apache-mod_auth_openidc或Keycloak Gatekeeper。但是我知道这可能需要重写代码,因此您应该仅将这些选项作为最后的选择。

     

关于SAML以及它为什么起作用:Keycloak适配器使用标准SAML SP元数据进行配置,该元数据严格而明确地定义了URL;在这里,我们需要承认SAML更成熟且功能完善。

     相反,OIDC允许一些自由。目前,Keycloak OIDC适配器不使用任何标准元数据,而是使用硬编码模板生成URL。我认为Keycloak适配器可以将OIDC的粗略等价物用于SAML元数据,即“知名” URL。

     

理论上,Keycloak OIDC适配器可以摄取此元数据,而不是对URL模板进行硬编码。对我来说,这可能是一个有价值的补充,但是令人惊讶的是,我没有看到任何相关的JIRA问题。也许Keycloak开发人员可以给我们一些反馈。

如果有一张Jira票证可以使用元数据而不是硬编码模板,我将更新此答案。