我正在处理一个 Multi-Tenancy 项目,其中用户名实际上是他们的电子邮件地址,电子邮件的域用作租户标识符。
现在在 keycloak 中,每个租户都有不同的领域,但我希望为所有租户和实际领域拥有一个登录页面,该页面将进行身份验证以通过用户名(电子邮件地址)以某种方式解析。
我该怎么做?
我在邮件列表(我现在找不到……)上找到了一个讨论相同问题的线程。这类似于 - 创建一个可以“代理”其他领域的主要领域,但我不太确定如何做到这一点。
最佳答案
我认为 Michał Łazowik 的答案是正确的,但是要使单点登录起作用,它需要稍微扩展一下。
请记住,因为 KEYCLOAK-4593如果我们有 > 100 个领域,我们可能还需要有多个 Keycloak 服务器。
我们需要:
auth-redirector.example.com
. 以下是整个 OAuth2 授权代码流程:
应用程序发现用户想要登录。在多个领域之前,领域的名称将是一个常量,因此应用程序将重定向到:
https://keycloak.example.com/auth/realms/realname/protocol/openid-connect/auth?$get_params
相反,它重定向到https://auth-redirector.example.com/?$get_params
auth-redirector 确定它本身是否具有此 session 的有效访问 token ,可能必须首先从发布它的 Keycloak 服务器刷新访问 token (用户可能已注销并尝试以不同的用户身份登录)来自不同的领域)。如果它有一个有效的访问 token ,我们可以根据访问 token 中的用户名或电子邮件地址确定 Keycloak 服务器和领域,并重定向到:
https://$keycloak_server/auth/$realm/realname/protocol/openid-connect/auth?$get_params
从这里开始,OAuth2 授权代码流程照常进行。否则,如果它没有有效的访问 token ,则 auth-redirector 将存储原始应用程序的
$get_params
作为 session 数据。它向用户呈现一个表单,要求输入用户名。当用户提交时,我们可以确定要使用的 Keycloak 服务器和领域,然后 auth-redirector 本身使用自己的 $get_params
登录到 Keycloak 服务器。 .一旦 auth-redirector 收到回调,它就会从 Keycloak 服务器检索访问+刷新 token 并将它们存储在 session 数据中。然后,最后,它重定向回与调用者原始 $get_params
相同的 key 斗篷服务器和领域。 (来自 session 数据)。 OAuth2 授权代码流程照常进行。这绝对是一个黑客!但我认为它可以工作。如果时间允许,我很想有一天尝试一下。
其他 OAuth2 流程需要其他黑客/解决方案......
关于single-sign-on - keycloak - 基于用户名(电子邮件地址)的领域解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44583833/