如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成
Posted
技术标签:
【中文标题】如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成【英文标题】:How to integrate keycloak in Spring Boot with a different context root and reverse proxy 【发布时间】:2017-06-01 14:39:37 【问题描述】:我们目前正在使用 Keycloak Spring Adapter(不是 Spring Boot 适配器)使用 Spring Boot 1.4 和 Keycloak 2.5.0(配置为 openid-connect 服务)开发微服务应用程序。
我们所有的微服务都放在负载均衡器和额外的反向代理之后,因为应用程序将托管在上下文根后面的现有域上(所以我们应用程序的根是http://foo.bar/foobar/,其余服务是@987654322 @)。
在这个给定的场景中,我们面临着 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 日更新: 将我的答案从这里移到答案
【问题讨论】:
另一个问题是,一旦通过身份验证,我们会直接重定向到我们的服务器,所以我们不是去foo.bar/foobar/rest/service,而是被重定向到localhost:8080/rest/service 嘿,我遇到了同样的问题,我确实使用类似的配置解决了它。您能否将您的解决方案添加为响应并将此问题检查为已解决?阅读这篇文章会更容易看到下一个要做什么。 好的,将其移至答案。如果您的解决方案有所不同,您也可以指定它吗? 其实不是,是同一个解决方案。我的意思是配置有点不同。我遇到了几乎同样的问题,但我想要一个仅限承载的应用程序,但我得到了我不想要的重定向。非常感谢您的回答。 【参考方案1】:我们现在已经开始使用 Keycloak,所以我将简要解释一下我们做了什么。我们应用程序的前端运行 Angular2,我们在 Angular 应用程序本身中创建了一个自定义登录页面(因此它不是 Keycloak 的主题),它将直接向 Keycloak API 查询 OAuth2 Bearer 令牌。前端将在 Authorization 标头中的每个请求上发送此令牌(根据 OAuth 标准)。
在服务端,我们将 keycloak 配置为仅承载解决方案(keycloak.json 中的bearer-only: true
),这样应用程序只返回 401 或 403,而不是转发到登录页面。
使用此配置,用户将永远不会从 /sso/login 页面看到任何内容,也不再存在重定向问题。
TLDR;我描述的用例也不现实,调用一个 REST URL 然后转发到一个登录页面是种不好的东西:)
【讨论】:
以上是关于如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成的主要内容,如果未能解决你的问题,请参考以下文章
如何在spring boot gradle项目中将时间戳附加到jar?
如何在 Wildfly 中将外部属性文件加载到 Spring Boot
如何在spring boot中将@Value属性从application.properties注入@InjectMocks?
如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行