如何在 Spring 使用不同的上下文根和反向代理启动时集成 keycloak
How to integrate keycloak in Spring Boot with a different context root and reverse proxy
我们目前正在使用 Keycloak Spring 适配器(不是 Spring引导适配器)。
我们所有的微服务都放在一个负载均衡器和一个额外的反向代理后面,因为应用程序将托管在上下文根后面的现有域上(因此我们应用程序的根是 http://foo.bar/foobar/ and the rest services are http://foo.bar/foobar/rest/)。
在这个给定的场景中,我们面临着 Keycloak 的几个问题:
- 如果需要登录,Keycloak 转发到 /sso/login。在我们的例子中,这是不需要的行为,因为 http://foo.bar/sso/login 将不存在。我找到了一种改变前向的方法,但是没有办法让 Keycloak 听同样的 url;在这种情况下,我们最终得到 404。
- 登录后,Keycloak 使用正确的令牌重定向回 /sso/login url,但如果这不是同一台服务器,请求将失败并将我们重定向到 http://foo.bar/.由于每个微服务都公开 /sso/login,这实际上可能是一个完全不同的服务器。
- 如果 keycloak 托管在同一个域中,我们最终会陷入重定向循环。我们还希望将 Keycloak 托管在同一域和上下文根 http://foo.bar/foobar/auth/ .
上
我们已经尝试使用 "token-store": "cookie"
但这并没有解决问题。
有没有办法解决这些问题,或者 Keycloak 可能不是我们用例的正确解决方案?
2017 年 5 月 5 日更新:
将我的答案从这里移至答案
我们现在启动 运行 Keycloak 所以我将简要解释一下我们做了什么。我们应用程序的 front-end 运行 Angular2 并且我们在 Angular 应用程序本身中创建了一个自定义登录页面(因此它不是 Keycloak 的主题),它将直接查询 Keycloak API 用于 OAuth2 Bearer 令牌。 front-end 将在授权 header 中的每个请求中发送此令牌(根据 OAuth 标准)。
在服务端,我们将 keycloak 配置为 bearer-only 解决方案(keycloak.json 中的 bearer-only: true
),这样应用程序只需 returns 401 或 403 而不是转发到登录页面。
使用此配置,用户将永远不会从 /sso/login 页面看到任何内容,也不再存在重定向问题。
TLDR;我描述的 use-case 也不现实,调用 REST URL 然后转发到登录页面是一种糟糕的东西:)
我们目前正在使用 Keycloak Spring 适配器(不是 Spring引导适配器)。
我们所有的微服务都放在一个负载均衡器和一个额外的反向代理后面,因为应用程序将托管在上下文根后面的现有域上(因此我们应用程序的根是 http://foo.bar/foobar/ and the rest services are http://foo.bar/foobar/rest/)。
在这个给定的场景中,我们面临着 Keycloak 的几个问题:
- 如果需要登录,Keycloak 转发到 /sso/login。在我们的例子中,这是不需要的行为,因为 http://foo.bar/sso/login 将不存在。我找到了一种改变前向的方法,但是没有办法让 Keycloak 听同样的 url;在这种情况下,我们最终得到 404。
- 登录后,Keycloak 使用正确的令牌重定向回 /sso/login url,但如果这不是同一台服务器,请求将失败并将我们重定向到 http://foo.bar/.由于每个微服务都公开 /sso/login,这实际上可能是一个完全不同的服务器。
- 如果 keycloak 托管在同一个域中,我们最终会陷入重定向循环。我们还希望将 Keycloak 托管在同一域和上下文根 http://foo.bar/foobar/auth/ . 上
我们已经尝试使用 "token-store": "cookie"
但这并没有解决问题。
有没有办法解决这些问题,或者 Keycloak 可能不是我们用例的正确解决方案?
2017 年 5 月 5 日更新: 将我的答案从这里移至答案
我们现在启动 运行 Keycloak 所以我将简要解释一下我们做了什么。我们应用程序的 front-end 运行 Angular2 并且我们在 Angular 应用程序本身中创建了一个自定义登录页面(因此它不是 Keycloak 的主题),它将直接查询 Keycloak API 用于 OAuth2 Bearer 令牌。 front-end 将在授权 header 中的每个请求中发送此令牌(根据 OAuth 标准)。
在服务端,我们将 keycloak 配置为 bearer-only 解决方案(keycloak.json 中的 bearer-only: true
),这样应用程序只需 returns 401 或 403 而不是转发到登录页面。
使用此配置,用户将永远不会从 /sso/login 页面看到任何内容,也不再存在重定向问题。
TLDR;我描述的 use-case 也不现实,调用 REST URL 然后转发到登录页面是一种糟糕的东西:)