创建自定义身份提供程序并使用密钥斗篷进行配置

时间:2020-06-16 14:13:44

标签: java keycloak openid-connect idp

我正在一个项目中,我需要创建一个应用程序,该应用程序将在仅支持OIDC进行身份验证的客户端和REST api之间充当OIDC中介程序。 REST API能够生成令牌并提供用户信息,但不支持OIDC。

要实现此目的,我正在考虑使用keycloak来处理与客户端的OIDC通信,并实现我自己的java应用程序,keycloak可以触发该Java应用程序来实现授权,令牌和userinfo端点(一种自定义的身份提供者)来处理与其余api进行通信。

我已经在keycloak中创建了一个领域,并将该领域配置为使用Identity Provider重定向器和我在keycloak中添加的Identity Provider(用户定义的OpenID Connect v1.0)。在身份提供者配置中,我已将所有URL都设置为指向我的Java应用程序,但是来自客户端的初始OIDC授权调用只是使用#error = login_required重定向到redirect_uri,而没有触发我在Java应用程序中的任何端点。

我想我想念一些东西。我需要干预授权流程,以便可以从需要在Java应用程序中处理的授权请求中获取查询参数。我还需要将其余api的令牌映射到令牌请求(当此请求来自客户端应用程序的后端时),最后将userinfo对象映射为对userinfo请求的响应。

我真的希望有人有时间向我指出正确的方向。提前非常感谢您。

编辑: 我添加了一个序列图来更好地解释它: enter image description here

我需要拦截授权请求调用,以获取用于标识用户的自定义查询参数(endUserString)。将没有用户登录表格。我的代码中需要使用用于REST API的参数。令牌和userinfo都必须从我的APP中接收,而不是从keycloak本身接收。

Java介体可以预先请求令牌(A),并使用它来访问Rest API(使用预定义的clientId和clientsecret)。或者,可以为每种方法获取此令牌。 To令牌必须用于从REST API(B)检索客户信息。我想用OIDC支持将其包装,而无需任何登录表单。浏览器将重定向到授权流程,并使用endUserString标识最终用户。客户信息将从Java介体返回到Keycloak中,以在GetUserInfoRsp中对此作出响应。

1 个答案:

答案 0 :(得分:1)

我认为可能有比您设想的更简单的解决方案:为Keycloak实现自己的自定义身份验证器

Keycloak具有身份验证流的概念,它是由Keycloak或定制提供的身份验证树。可以调用每个身份验证器来尝试对用户进行身份验证。

最常见的一种是 Username / Password Form (用户名/密码表单),该表单向用户显示登录页面,并在提供的凭据有效时对用户进行身份验证。但是您可以想象任何类型的身份验证器,例如SMS authenticatormagic link one

您可以找到existing Keycloak's authenticators on their repo和有关如何创建自己的here的文档。

在您的情况下,您需要实现自己的逻辑,其中身份验证器将从请求中获取endUserString参数,并调用REST API来验证用户的身份。您可以在初始化时或为每个请求获取REST API令牌。您还可以使用来自REST API用户信息端点(通用OIDC属性或自定义属性)的数据修改Keycloak中存储的用户。

请注意,开发团队宣布了Keycloak X,这是对项目的一种重新启动,可能会对其API进行重大更改。

此外,请考虑您设计的所有安全影响,因为从您提供的内容来看,似乎用户的身份验证将仅依赖于简单的查询参数,例如,如果该参数不随时间变化,它会感觉到就像一个大安全漏洞。