首页 > 解决方案 > Keycloak - 使用 master 对不同领域的内省令牌

问题描述

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

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

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

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

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

有这样的可能吗?如果不是,我可以查看哪些其他途径?

标签: keycloakkong

解决方案


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

如果您使用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);

推荐阅读