8

假设我们有几个微服务。他们每个人都使用 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 实例。还有其他建议吗?

4

2 回答 2

6

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

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

于 2017-10-23T05:04:19.240 回答
3

如果这在开发的早期阶段对任何人都有帮助,您可以将 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

于 2020-09-28T03:14:12.163 回答