我正在开展多租户项目,其中用户名实际上是他们的电子邮件地址,而电子邮件的域名则作为租户标识符。
现在在keycloak中我将为每个租户提供不同的域,但我想为所有租户设置一个登录页面,并且将通过用户名(电子邮件地址)以某种方式解析身份验证的实际域。
我该怎么做?
我在邮件列表上找到了一个帖子(我现在找不到......),讨论了同样的问题。这有点像 - 创建一个主要的领域,将“代理”给其他人,但我不太确定如何做到这一点。
答案 0 :(得分:1)
The idea是要编写一个服务(例如auth-redirector.example.com
),该服务具有单个电子邮件输入字段,根据域查找领域并重定向到该领域的密钥库端点(例如{ {1}}),同时保留所有GET参数。
您可以在此处找到直接登录/注册URL的示例:https://lists.jboss.org/pipermail/keycloak-user/2016-July/007045.html
一个可用性问题是用户将不得不提供两次电子邮件,但我还没有找到一种通过登录URL传递用户名的方法。
答案 1 :(得分:0)
我认为MichałŁazowik的答案是在正确的轨道上,但是要使Single Sign-On正常工作,需要稍微扩展一下。
请记住,由于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会确定它本身是否对此会话具有有效的访问令牌,也许必须先从发出该令牌的Keycloak服务器中刷新访问令牌(该用户可能已经注销,并尝试以其他用户身份登录)由另一个领域提供服务。
如果具有有效的访问令牌,我们可以根据访问令牌中的用户名或电子邮件地址确定Keycloak服务器和领域,然后重定向至:
https://$keycloak_server/auth/$realm/realname/protocol/openid-connect/auth?$get_params
从此处开始,OAuth2授权代码流照常进行。
否则,如果没有没有有效的访问令牌,则auth-redirector会将原始应用的$get_params
存储为会话数据。它向用户提供一个表单,要求用户名。当用户提交时,我们可以确定要使用的Keycloak服务器和领域,然后auth-重定向器 itself 使用其自己的$get_params
登录到Keycloak服务器。一旦auth-redirector收到回叫,它将从Keycloak服务器检索access + refresh令牌并将其存储在会话数据中。然后,最后,它重定向回同一台密钥库服务器,并返回原始调用者$get_params
(来自会话数据)。然后,OAuth2授权代码流将照常进行。
这绝对是黑客!但我认为这可能有效。如果时间允许,我希望有一天可以尝试一下。
其他OAuth2流还需要其他黑客/解决方案...