Keycloak - 使用 master 对不同领域的内省令牌

Posted

技术标签:

【中文标题】Keycloak - 使用 master 对不同领域的内省令牌【英文标题】:Keycloak - Introspect tokens for different realms using master 【发布时间】:2020-06-05 22:21:45 【问题描述】:

我们正在构建一个应用程序,多个客户可以在其中注册并拥有自己的用户群。例如,客户“CompanyA”可以注册,然后允许他们的用户使用他们自己的用户名(一些来自 LDAP)访问我们的系统。 “CompanyB”也可以这样做,用户名对于一个客户来说是唯一的,但可以在不同客户之间重复。

我们为此使用 keycloak,并使用领域的概念来实现这一点。当新客户注册时,我们为他们创建一个新领域并进行所需的配置。这按预期工作,但我们的中间件有问题。

我们的中间件是 Kong,它有一个 OIDC 插件,我们与 keycloak 集成,但是该插件需要域名,在我们的例子中实际上是动态的。

例如: 当用户从我们的 UI 登录时,他会收到来自其客户端领域的令牌。现在,当用户从我们的后端请求资源时,该请求将通过 kong。

Kong 将使用其配置的客户端和领域来内省此令牌,但是这不能动态选择,因此理想情况下,我希望在主领域上为每个客户端领域配置一个客户端,并使用此魔术客户端来内省他们的令牌。

有这样的可能性吗?如果不是,我还可以研究哪些其他途径?

【问题讨论】:

【参考方案1】:

您可以检查访问令牌以查看它是从哪个领域创建的。

如果您使用 https://jwt.io/ 之类的内容解码 JWT 令牌,您将在令牌上看到一个名为 issuer 的属性。那是创建令牌的领域的 url。

所以要获得领域,你可以这样做:

import org.keycloak.TokenVerifier;
import org.keycloak.representations.AccessToken;
...

    AccessToken token = (AccessToken)TokenVerifier.create(tokenString, 
    AccessToken.class).parse().getToken();
    String realm = token.getIssuer().substring(token.getIssuer().lastIndexOf(47) + 1);

【讨论】:

我应该把这段代码放在哪里?钥匙斗篷里面还是什么? 无论您需要在哪里从令牌中获取领域。我们在 spring 服务中使用它。听起来您可能需要它而不是 Kong 将领域传递给 Kong 插件。

以上是关于Keycloak - 使用 master 对不同领域的内省令牌的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak登录表单

访问令牌后的Keycloak授权过程

“限制身份验证会话”如何在 keycloak 中工作

Keycloak注销请求不会注销用户

在 Keycloak 登录主题中获取 root url

无法使用 Keycloak 评估基于 Javascript 的策略