假设我们有几项微服务。他们每个人都使用Keycloak身份验证。我们还有基于ex的负载均衡器。 nginx有外部URL和不同的keycloak路由(例如,在OpenShift中它可以是https://keycloak.rhel-cdk.10.1.2.2.xip.io)。但在内部,此地址可能无法访问。同时具有依赖于负载均衡器URL的微服务配置有点奇怪。更合适的是在微服务或甚至短URI中使用内部keycloak auth URL。但在这种情况下,由于发行方验证问题,将无法验证令牌。如何以良好和灵活的方式配置?我可以简单地覆盖realmInfoUrl以更改验证吗?我可以定义将用于基于客户端的令牌的发行者。
另一个问题是如何更好地处理多租户场景?首先在客户端,我想我们对多租户没有任何具体的支持。我应该通过在不同的URL /标头之间切换并使用正确的Config Resolver来手动处理。在服务器端,我需要为每种情况动态提供一个正确的KeycloakDeployment实例。还有其他建议吗?
答案 0 :(得分:1)
不幸的是,根据令牌中的发行者(" iss")字段,Keycloak的令牌验证过于严格。它要求用于验证令牌的URL与" iss"中的URL匹配。字段。
前段时间我为这个问题开了一张JIRA票(投票给它!):https://issues.jboss.org/browse/KEYCLOAK-5045
答案 1 :(得分:1)
如果这可以在开发的早期阶段帮助任何人,则可以将Host标头设置为后端服务在令牌验证期间将使用的keycloak url。这样,生成的令牌将在颁发者字段中包含您的主机标头网址。在我的沙箱中,我在docker上的keycloak运行在keycloack:8080上,并且进行了功能测试,该测试通过localhost:8095调用了keycloack以请求令牌(直接授予)。在将主机标头设置为keycloack:8080之前,由于后端服务已连接到keycloak:8080和TokenVerifier上的keycloak,因此将发件人字段设置为localhost:8095,并且令牌通过“ Invalid token issuer”错误使验证失败。 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