Keycloak的发行方验证和多租户方法

8
假设我们有几个微服务,每个微服务都使用Keycloak身份验证。我们还有基于例如nginx的负载均衡器,它具有外部URL和不同路由到keycloak(例如,在OpenShift中可以是https://keycloak.rhel-cdk.10.1.2.2.xip.io)。但在内部,这个地址可能是无法访问的。另外,使微服务配置依赖于负载均衡器URL有点奇怪。更合适的做法是在微服务内部使用内部keycloak auth URL或甚至是短URI。但在这种情况下,令牌将无法通过发行者验证问题得到验证。如何以良好灵活的方式进行配置?我是否可以简单地覆盖realmInfoUrl以改变验证?我可以定义基于客户端的令牌将使用哪个发行者。
另一个问题是如何更好地处理多租户场景?首先,在客户端方面,我猜我们没有任何特定于多租户的支持。我应该手动处理这个问题,通过在不同的URL/标头之间切换,并使用适当的Config Resolver。在服务器端,我需要为每种情况动态提供适当的KeycloakDeployment实例。还有其他建议吗?

2
嗨,@alexander Kalinovski,你有没有想到解决这个问题的方法? - aryan
你找到任何解决方案了吗? - Rasool Ghafari
2个回答

6
很遗憾,Keycloak 对 token 中的发行者("iss")字段进行验证时过于严格。它要求用于验证令牌的 URL 必须与 "iss" 字段中的 URL 相匹配。
一段时间前,我为这个问题开了一个 JIRA 票(请投票支持!):https://issues.jboss.org/browse/KEYCLOAK-5045

@Boomar,今天有没有设置自定义发行人的解决方法? - aryan
@Boomar 你好,已经过去了3年。是否有任何更新?谢谢! - ch271828n
我也在寻找解决方案。 - Kostanos
1
是的,有一种解决方案。您可以在反向代理/负载均衡器中将__frontendUrl__参数设置为Keycloak URL。这将使Keycloak内部处理对后端URL的直接调用,就像它们是针对前端URL发送的一样。 请参阅https://www.keycloak.org/docs/latest/server_installation/index.html#default-provider - Boomer

3
如果在开发的早期阶段能对某些人有所帮助,您可以将Host标头设置为后端服务在令牌验证期间将使用的Keycloak网址。这样,生成的令牌将在发行者字段中包含您的 Host 标头 URL。在我的沙盒中,我在 keycloack:8080 上运行了 Keycloak 的 Docker,并通过 localhost:8095 调用 Keycloak 发出了请求令牌(直接授权)。在将 Host 标头设置为 keycloack:8080 之前,发行者字段被设置为 localhost:8095,并且该令牌因“无效的令牌发行者”错误而未通过验证,因为后端服务连接到 keycloak:8080 并且 TokenVerifier.java 进行以下检查。
        public boolean test(JsonWebToken t) throws VerificationException {
            if (this.realmUrl == null) {
                throw new VerificationException("Realm URL not set");
            } else if (!this.realmUrl.equals(t.getIssuer())) {
                throw new VerificationException("Invalid token issuer. Expected '" + this.realmUrl + "', but was '" + t.getIssuer() + "'");
            } else {
                return true;
            }
        }

参考资料:https://github.com/keycloak/keycloak-community/blob/master/design/hostname-default-provider.md


该文档介绍了 Keycloak 默认主机名提供程序的设计。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接