繁体   English   中英

创建自定义身份提供者并使用 keycloak 对其进行配置

[英]Create a custom identity provider and configure it with keycloak

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

为了实现这一点,我正在考虑使用 keycloak 来处理与客户端的 OIDC 通信并实现我自己的 java 应用程序,keycloak 可以触发该应用程序以实现授权、令牌和 userinfo 端点(一种自定义的自制身份提供者)处理与客户端的通信rest api。

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

我想我错过了一些东西。我需要干预授权流程,以便我可以从需要在我的 java 应用程序中处理的授权请求中获取查询参数。 I also need to map the token from the rest api into the token request (when this request comes from the backend of the client app), and finally map the userinfo object as a response to the userinfo request.

我真的希望有人有时间为我指明正确的方向。 非常感谢你。

编辑:我添加了一个序列图来更好地解释它: 在此处输入图像描述

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

Java 调解器可能会提前请求令牌 (A) 并使用它来访问 Rest API(使用预定义的 clientId 和 clientsecret)。 或者,可以为每个方法获取此令牌。 To token 必须用于从 REST API (B) 中检索客户信息。 我想在没有任何登录表单的情况下使用 OIDC 支持来包装它。 浏览器只会重定向到授权流程,其中 endUserString 标识最终用户。 客户信息将从 java 中介返回到 keycloak,在 GetUserInfoRsp 中对此作出响应。

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

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

最常见的一种是用户名/密码表单,它向用户显示登录页面,并在提供的凭据有效时对用户进行身份验证。 但是您可以想象任何类型的身份验证器,例如SMS 身份验证器或魔术链接身份验证器。

你可以在他们的 repo 上找到现有的 Keycloak 的身份验证器,以及如何在此处创建自己的文档。

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

请注意,开发团队宣布了 Keycloak X ,这是项目的一种重启,可能会给他们的 API 带来重大变化。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM