keycloak - 基于用户名的领域解析(电子邮件地址)

时间:2017-06-16 07:54:09

标签: single-sign-on multi-tenant keycloak

我正在开展多租户项目,其中用户名实际上是他们的电子邮件地址,而电子邮件的域名则作为租户标识符。

现在在keycloak中我将为每个租户提供不同的域,但我想为所有租户设置一个登录页面,并且将通过用户名(电子邮件地址)以某种方式解析身份验证的实际域。

我该怎么做?

我在邮件列表上找到了一个帖子(我现在找不到......),讨论了同样的问题。这有点像 - 创建一个主要的领域,将“代理”给其他人,但我不太确定如何做到这一点。

2 个答案:

答案 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服务器。

我们需要:

  • 专门用于此目的的单独的HTTP服务器auth-redirector.example.com
  • 从用户名(电子邮件地址)确定Keycloak服务器和领域的算法。

这将是整个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流还需要其他黑客/解决方案...