【问题标题】:Keycloak issuer validation and multi-tenancy approachKeycloak 颁发者验证和多租户方法
【发布时间】: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,你有没有解决这个问题..?
  • 你找到解决办法了吗?

标签: keycloak keycloak-services


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多