7

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(现在正在运行)。

我该怎么做呢?我错过了什么愚蠢的明显步骤!?

4

1 回答 1

1

不幸的是,您不能告诉 Gatekeeper 返回 401(403) 响应代码而不是重定向。有类似的问题:https ://issues.jboss.org/browse/KEYCLOAK-11082

您可以做的是完全删除 Gatekeeper 并在前端(JS 适配器)和后端(Java 适配器)上实现仅承载客户端的公共客户端身份验证。如果您的 Java 应用程序服务于前端,则您只能实现机密客户端身份验证并为 /api/* 请求返回 401(403) 响应。

于 2019-10-08T17:00:35.523 回答