运行 keycloak 网守背后的用户界面和 API

Running User Interfaces and APIs behind keycloak gatekeeper

keycloak 和一般身份验证的新手,很抱歉遗漏了一些明显的东西,并且没有使用准确的术语。

我正在尝试 运行 一个与 Java(dropwizard)API 对话的简单 Angular UI。我希望这两个都需要授权。我(几乎)能够让他们 运行ning 在 keycloak 和 keycloak 看门人后面使用单一领域和机密客户端。在这种情况下,网守有一个 upstream-url 是一个 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 项目都是不可知论者(即它们还没有 运行ning 任何适配器等 - 我依赖于docker 设置以暂时阻止 "direct" 访问 UI 和 API。一旦我需要了解有关用户的信息,我将添加适配器)。我可以在 https://www.keycloak.org/docs/latest/securing_apps/index.html#configuration-options 中看到 autodetect-bearer-only 选项似乎描述了我的问题,即

It allows you to redirect unauthenticated users of the web application to the Keycloak login page, but send an HTTP 401 status code to unauthenticated SOAP or REST clients instead as they would not understand a redirect to the login page

但似乎适用于适配器层,即在我的场景中在网守之后。 this 看起来也很相似。

我想我想要对 https://my.domain/ui/* to be redirected to the keycloak login page, but https://my.domain/api/* 的未经身份验证(例如从未登录或超时)的访问请求到 401。

并且从 https://my.domain/ui/somepage ajax 请求 https://my.domain/api/getstuff 使用 JWT/token/cookie浏览器已经从登录(现在正在工作)。

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

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

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