keycloak - Keycloak - 使用 master 对不同领域的内省令牌
问题描述
我们正在构建一个应用程序,多个客户可以在其中注册并拥有自己的用户群。例如,客户“CompanyA”可以注册,然后允许他们的用户使用他们自己的用户名(一些来自 LDAP)访问我们的系统。“CompanyB”也可以这样做,用户名对于一个客户来说是唯一的,但可以在不同客户之间重复。
我们为此使用 keycloak,并使用领域的概念来实现这一点。当新客户注册时,我们为他们创建一个新领域并进行所需的配置。这按预期工作,但我们的中间件有问题。
我们的中间件是 Kong,它有一个 OIDC 插件,我们与 keycloak 集成,但是插件需要域名,在我们的例子中,域名实际上是动态的。
例如:当用户从我们的 UI 登录时,他会收到来自其客户端领域的令牌。现在,当用户从我们的后端请求资源时,该请求将通过 kong。
Kong 将使用其配置的客户端和领域来内省此令牌,但是这不能动态选择,因此理想情况下,我希望在主领域上为每个客户端领域配置一个客户端,并使用这个魔术客户端来内省他们的令牌。
有这样的可能吗?如果不是,我可以查看哪些其他途径?
解决方案
您可以检查访问令牌以查看它是从哪个领域创建的。
如果您使用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);
推荐阅读
- python - 如何使用 python 模拟 websocket 请求并捕获流数据?
- r - 在 grepl 之后将字符串分成新行
- windows - Powershell 替换 vs sed
- amazon-web-services - [serverless-framework]将应用程序部署到新阶段尝试更新旧阶段
- swiftui - ScrollView 文本对齐 SwiftUI
- r - 为轴刻度上的数字添加后缀?
- python - SQLAlchemy 不一致的结果自引用关系
- python - Django:为产品模型添加每月目标和每日生产
- mongodb - 在自定义组中计数后的组结果
- c# - 当 Interaction.Handle 接收到重复值时,命令引发异常