对于密钥斗篷来说是新手,并且通常是身份验证,因此很抱歉缺少明显的内容,并且未使用准确的术语。
我正在尝试运行一个与Java(dropwizard)API对话的简单Angular UI。我想要两个都需要身份验证。我(几乎)能够使用单个域和机密客户端在keycloak和keycloak Gatekeeper后面正常运行。在这种情况下,网守具有一个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)到密钥库登录页面。对于API请求,这种重定向有点荒谬……
在这一点上,我的UI和API项目都是不可知的(即,它们还没有运行任何适配器等)-我现在依靠docker设置来防止对UI和API的“直接”访问。我需要了解有关用户的信息后,将添加适配器。我在https://www.keycloak.org/docs/latest/securing_apps/index.html#configuration-options中看到了autodetect-bearer-only
选项,该选项似乎描述了我的问题,即
它允许您将Web应用程序的未经身份验证的用户重定向到Keycloak登录页面,但是将HTTP 401状态代码发送到未经身份验证的SOAP或REST客户端,因为他们不了解重定向至登录页面的情况
但似乎适用于适配器层,即在我的场景中,是在网守之后。 this看起来也很相似。
我想我希望对https://my.domain/ui/ *的未经身份验证(例如,从未登录或超时)的访问请求被重定向到密钥斗篷登录页面,但将https://my.domain/api/ *重定向到401。
然后从https://my.domain/ui/somepage到https://my.domain/api/getstuff的ajax请求使用浏览器从登录名(现在正在运行)中获得的JWT /令牌/ cookie。
我该怎么做?我错过了哪个愚蠢的明显步骤!?
答案 0 :(得分:1)
不幸的是,您不能告诉Gatekeeper返回401(403)响应代码而不是重定向。存在类似的问题:https://issues.jboss.org/browse/KEYCLOAK-11082
您可以做的是完全删除Gatekeeper,并在前端(JS适配器)和后端的纯承载客户端(Java适配器)上实现公共客户端身份验证。如果您的Java应用程序服务于前端,则您只能实现机密的客户端身份验证,并为/ api / *请求返回401(403)响应。