Keycloak 颁发者验证和多租户方法

Posted

技术标签:

【中文标题】Keycloak 颁发者验证和多租户方法【英文标题】:Keycloak issuer validation and multi-tenancy approach 【发布时间】:2017-12-17 04:55:19 【问题描述】:

假设我们有几个微服务。他们每个人都使用 Keycloak 身份验证。我们还有基于 for ex 的负载均衡器。 nginx,它具有外部 URL 和到 keycloak 的不同路由(例如,在 OpenShift 中它可以是 https://keycloak.rhel-cdk.10.1.2.2.xip.io)。但在内部,此地址可能无法访问。还具有依赖于负载均衡器 URL 的微服务配置有点奇怪。更合适的是在微服务内部使用内部 keycloak auth URL,甚至是短 URI。但在这种情况下,由于颁发者验证问题,令牌不会被验证。如何以良好和灵活的方式进行配置?我可以简单地覆盖 realmInfoUrl 以更改验证吗?我可以定义哪个颁发者将用于基于客户端的令牌。

另一个问题是如何更好地处理多租户场景?首先在客户端,我想我们没有对多租户的任何特定支持。我应该通过在不同的 URL/标题之间切换并使用适当的配置解析器来手动处理这个问题。在服务器端,我需要为每种情况动态提供适当的 KeycloakDeployment 实例。还有其他推荐吗?

【问题讨论】:

嗨@alexander Kalinovski,你有没有解决这个问题..? 你找到解决办法了吗? 【参考方案1】:

不幸的是,根据令牌中的颁发者(“iss”)字段,Keycloak 的令牌验证过于严格。它要求用于验证令牌的 URL 与“iss”字段中的 URL 匹配。

不久前,我为这个问题开了一张 JIRA 票(投票给它!):https://issues.jboss.org/browse/KEYCLOAK-5045

【讨论】:

@Boomar,今天有设置自定义发行者的解决方法吗? @Boomar Hi 3 年过去了。那么有更新吗?谢谢! 我也在寻找解决方案 是的,有一个解决方案。您可以将 frontendUrl 参数设置为反向代理/负载均衡器中的 Keycloak URL。这将使 Keycloak 在内部处理对后端 URL 的直接调用,就好像它们是针对前端 URL 发送的一样。见keycloak.org/docs/latest/server_installation/…【参考方案2】:

如果这对开发早期阶段的任何人有所帮助,您可以将 Host 标头设置为您的后端服务将在验证令牌期间使用的 keycloak url。这样,生成的令牌将在颁发者字段中包含您的 Host 标头 url。在我的沙箱中,我在 docker 上以 keycloack:8080 运行 keycloak,并通过 localhost:8095 调用 keycloack 以请求令牌(直接授予)的功能测试。在将 Host 标头设置为 keycloack:8080 之前,颁发者字段被设置为 localhost:8095,并且由于后端服务在 keycloak:8080 和 TokenVerifier 上连接到 keycloak,因此令牌验证失败并出现“无效令牌颁发者”错误。 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 颁发者验证和多租户方法的主要内容,如果未能解决你的问题,请参考以下文章

Azure Identity:自定义令牌验证以验证多租户应用程序中的颁发者

是否有一种优雅的方法可以为多租户应用程序克隆具有所有配置(客户端和角色)的 Keycloak 领域?

Keycloak 中的多租户可以在一个领域内完成吗?

LightSpeed 和多租户数据库

多租户和多应用怎么对应

使用 Keycloak 和 SpringBoot 的多租户