keycloak 和一般身份验证的新手,很抱歉遗漏了一些明显的东西,并且没有使用准确的术语。
我正在尝试运行一个与 Java (dropwizard) API 对话的简单 Angular UI。我希望这两个都需要身份验证。我(几乎)能够使用单个领域和机密客户端让它们在 keycloak 和 keycloak 看门人后面正常运行。在这种情况下upstream-url
,gatekeeper 有一个 traefik 实例,然后路由到 UI 或 API docker 容器。就像是:
Gatekeeper upstream-url ----> Traefik (my.domain/*) ----> UI (my.domain/ui/*)
\---> API (my.domain/api/*)
这工作正常,直到会话超时,并且当(已加载)UI 页面上的用户单击尝试发送 ajax 请求以访问 API 的按钮时(例如https://my.domain/api/getstuff),然后 Gatekeeper 将其重定向(即 301)到 keycloak 登录页面。这个重定向对于 API 请求来说有点荒谬......
在这一点上,我的 UI 和 API 项目都与身份验证无关(即它们还没有运行任何适配器等 - 我现在依靠 docker 设置来防止“直接”访问 UI 和 API。我会一旦我需要了解有关用户的信息,请添加适配器)。我可以在https://www.keycloak.org/docs/latest/securing_apps/index.html#configuration-optionsautodetect-bearer-only
中看到似乎描述我的问题的选项,即
它允许您将 Web 应用程序的未经身份验证的用户重定向到 Keycloak 登录页面,但将 HTTP 401 状态代码发送到未经身份验证的 SOAP 或 REST 客户端,因为他们无法理解到登录页面的重定向
但似乎适用于适配器层,即在我的场景中的网守之后。 这似乎也很相似。
我想我希望将未经身份验证(例如从未登录或超时)对https://my.domain/ui/ * 的访问请求重定向到 keycloak 登录页面,但https://my.domain/api/ *到 401。
并从https://my.domain/ui/somepage向https://my.domain/api/getstuff发出ajax 请求,以使用浏览器从登录中获得的 JWT/token/cookie(现在正在运行)。
我该怎么做呢?我错过了什么愚蠢的明显步骤!?