问题标签 [keycloak-gatekeeper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
62 浏览

authentication - Keycloak 是否支持某种形式的中间人身份验证?

我正在使用 keycloak 让我的用户使用我的应用程序进行身份验证。我正在尝试将一些功能迁移到一些插件,例如 wordpress 插件。对于这些插件,我想使用通用解决方案,因此我从 Microsoft 找到了以下身份验证过程(https://docs.microsoft.com/en-us/office/dev/add-ins/develop/auth-external-add- ins#middleman-services ) 和 Adob​​e ( https://adobexdplatform.com/plugin-docs/tutorials/how-to-integrate-with-OAuth/ )。

我设法破解了这个过程,让它与 keycloak 一起工作。但此时我有点担心这个过程带来的安全风险。

分步流程

  1. (插件)客户端要求后端服务器生成代码来识别用户。
  2. (插件)客户端开始轮询后端以获取身份验证代码(尚未响应,因为用户尚未登录)。
  3. 该插件使用 keycloak 登录页面打开浏览器窗口或选项卡。一切都与正常流程相同,但这次我们添加了一个重定向 uri,其中包含第一步中生成的代码,用于识别用户。
  4. 一旦用户登录,用户就会在浏览器中重定向到一个端点,其中第一步中的代码链接到在此步骤中检索到的访问令牌。
  5. 来自步骤 2 的轮询现在将访问令牌返回给(插件)客户端。

我需要轮询访问令牌的原因是我想为所有客户端创建一个通用的登录过程。

简而言之,鉴于上述步骤,我想知道安全风险是什么。此外,我似乎找不到任何他们想要实现此类功能的 keycloak 信息。有谁知道他们是否想实现这一点,因为许多其他插件确实提供了这种功能,可以在插件外部通过弹出窗口进行身份验证,并通过“轮询”服务器来检索访问令牌。

谢谢您的帮助。

0 投票
1 回答
2849 浏览

kubernetes - 如何使用 keycloak-gatekeeper 保护 Kibana 仪表板?

电流:

传入请求 (/sso-kibana) --> Envoy 代理 --> /sso-kibana

预期流量:

传入请求 (/sso-kibana) --> Envoy 代理 --> keycloak-gatekeeper --> keycloak

--> 如果未登录 --> keycloak 登录页面 --> /sso-kibana

--> 如果已经登录 --> /sso-kibana

我将 keycloak-gatekeeper 部署为具有以下配置的 k8s 集群:

keycloak-gatekeeper.yaml

看门人.yaml

特使.yaml

问题:

我可以在 /Kibana 上调用 keycloak 登录,但登录后用户不会去 /Kibana url,即 Kibana 仪表板没有加载。

注意: Kibana 也作为 k8s 集群运行。

参考资料:
https ://medium.com/@vcorreaniche/securing-serverless-services-in-kubernetes-with-keycloak-gatekeeper-6d07583e7382

https://medium.com/stakater/proxy-injector-enabling-sso-with-keycloak-on-kubernetes-a1012c3d9f8d

更新 1:

我可以在 /sso-kibana 上调用 keycloak 登录,但在输入凭据后它会给出 404。流程如下:

Step 1.点击http://something/sso-kibana
Step 2. Keycloak 登录页面打开https://keycloak/auth/realms/THXiRealm/protocol/openid-connect/auth ?...
Step 3.进入后凭据重定向到此 URL https://something/sso-kibana/oauth/callback?state=890cd02c-f ...
步骤 4. 404

更新 2:

在 Envoy.yaml 中添加新路由后,404 错误得到解决

特使.yaml

因此,预期流程(如下所示)现在工作正常。

传入请求 (/sso-kibana) --> Envoy 代理 --> keycloak-gatekeeper --> keycloak

--> 如果未登录 --> keycloak 登录页面 --> /sso-kibana

--> 如果已经登录 --> /sso-kibana

0 投票
1 回答
797 浏览

keycloak - 在 keycloak 看门人后面运行用户界面和 API

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

我正在尝试运行一个与 Java (dropwizard) API 对话的简单 Angular UI。我希望这两个都需要身份验证。我(几乎)能够使用单个领域和机密客户端让它们在 keycloak 和 keycloak 看门人后面正常运行。在这种情况下upstream-url,gatekeeper 有一个 traefik 实例,然后路由到 UI 或 API docker 容器。就像是:

这工作正常,直到会话超时,并且当(已加载)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(现在正在运行)。

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

0 投票
1 回答
4693 浏览

keycloak - keycloak 网守中重定向 url 的目的是什么?

我正在尝试将 Keycloak Gatekeeper 设置为我的服务前的反向代理,但我不知道redirection-url. 我想我可以把 Gatekeeper 放在我的服务前面,而我的服务不需要知道任何关于 authn/z 的信息。如果需要回调端点,这似乎是不可能的。

我能够部署 Keycloak Server、Keycloak Gatekeeper 和一个简单的节点服务(全部部署在本地 docker 容器中)。通过对我的主机文件进行一些黑客攻击,我能够向 Gatekeeper 发送一个请求,它正确地对我进行身份验证并将我重定向回我的节点服务。但是,我的节点服务需要添加一个/oauth/callback端点,因为 Gatekeeper 将该后缀添加到redirection-url.

这是我的 Gatekeeper 配置的样子:

我希望能够将 Gatekeeper 放在不了解身份验证、授权、OIDC 等的服务前面,但这redirection-url似乎是不可能的。

有没有办法让 Gatekeeper 在需要时进行 authnz 并在用户通过正确身份验证时充当简单的代理?或者有什么我不明白的地方这是不可能的吗?

0 投票
1 回答
1952 浏览

docker - 如何将容器化的 Keycloak-gatekeeper 配置为反向代理?

我想完成以下配置来为 Web 服务器提供身份验证和授权:

在此处输入图像描述

每个服务器都是一个单独的 Docker 容器。特别是,我正在使用以下内容docker-compose.yml

如您所见,反向代理(Keycloak-gatekeeper)正在侦听 Docker 也公开的端口 3000。我想要完成的是访问http://server_host:3000用户被重定向到 Keycloak 进行身份验证,如果成功,则重定向到正在侦听端口 8080 的 Web 服务器。

这是keycloak-gatekeeper.conf我正在使用的:

但是,给定此配置,访问 URL http://server_host:3000浏览器会显示 ERR_CONNECTION_REFUSED。

可能是什么问题呢?

0 投票
2 回答
2623 浏览

keycloak - 在后端 API 前使用 Keycloak Gatekeeper

在 DOMAIN 上运行的单页应用程序 (SPA) 上,对 DOMAIN/graphql 的调用被重新路由到后端。前端和后端都通过 Keycloak Gatekeeper 实例进行保护。

这个想法是前端和后端共享kc-access令牌。

现在,访问令牌在后端 Gatekeeper 中过期。如果 SPA 在浏览器中刷新,则前端将重新路由到 Keycloak,并且需要新的访问令牌。但是,如果没有刷新,当令牌过期时,对 DOMAIN/graphql 的 POST 请求会失败并返回 307 状态码。浏览器不知道如何处理。浏览器日志记录提供"{"error":"RESTEASY003065: Cannot consume content type"}". 如果 POST 的内容类型标头被删除,则错误为“未提供 client_id”,而 client_id 包含在查询字符串中。

将 POST 请求重定向到 Keycloak 可能不是最好的解决方案。如果后端刷新其访问令牌本身,则更清洁。

这就是我们通过将会话状态存储添加到后端的 Gatekeeper 来尝试的。我们正在使用以下配置:

这确实在 Gatekeeper 中创建了一个 /boltdb 文件,但它似乎没有被使用,因为该文件没有更改。

后端的 Gatekeeper 提供以下日志记录:

所以我们“无法找到用户的刷新令牌”,因为根据日志记录“没有找到会话状态”。

有人知道如何启用令牌刷新吗?

0 投票
1 回答
2374 浏览

openid-connect - 通过 /oauth/logout 的 Keycloak 网守注销不起作用

我正在使用 keycloak 网守来保护一个简单的前端 Web 应用程序,它运行良好;用户需要在到达实际站点之前登录。

问题是注销。当我使用 /oauth/logout URL 时,它似乎破坏了应用程序中的本地会话,但实际上并没有将用户注销。下次我刷新时,用户再次登录。

我检查了 keycloak 网守日志,每当我点击注销 URL 时,我都会看到这个;

看起来它尝试调用吊销 URL,失败,然后再次登录用户。问题是为什么调用revocation-url 失败。我没有设置任何自定义,这只是 keycloak + keycloak-gatekeeper 开箱即用。

任何人都可以对此有所了解吗?

这是网守配置(部署在 Kubernetes 中);

0 投票
1 回答
416 浏览

token - Keycloak 网守更新令牌但不将其添加到请求中

我需要在哪里发送请求以更新访问令牌?因为如果我向我的资源服务发送请求,即使网守更新了令牌,我也会遇到令牌过期异常。

我想使用刷新令牌更新访问令牌。网守文档说“如果对访问令牌的请求包含刷新令牌并且 --enable-refresh-tokens 设置为 true,则代理将自动为您刷新访问令牌。” - https://www.keycloak.org/docs/latest/securing_apps/index.html#refresh-tokens

实际上,当令牌过期时,网守会更新访问令牌并将其注入响应中的某处,但是当请求被转发到资源服务时,我有 ExpiredJwtException,因为请求中没有新的刷新令牌。我可以在失败的响应中看到有一个旧令牌而不是新令牌。但是,如果资源服务端发生超时错误并且网守向用户返回自己的响应,那么我可以看到访问和刷新令牌已更新。

这是网守日志:

0 投票
2 回答
3523 浏览

keycloak - Keycloak Gatekeeper 始终无法验证“iss”声明值

添加match-claims到配置文件似乎没有做任何事情。实际上,Gatekeeper在打开资源(有或没有属性)时总是给我同样的错误。

我的Keycloak服务器位于 docker 容器内,可从内部网络http://keycloak:8080访问,就像从外部网络访问http://localhost:8085.

我让Gatekeeper连接到内部网络中的 Keycloak 服务器。该请求来自外部请求,因此,discovery-url不会匹配“iss”令牌声明。

Gatekeeper 正试图使用discovery-url​​ as 'iss'声明。为了覆盖这一点,我添加了match-claims如下属性:

日志如下所示:

启动时

根据要求

这最终导致403 Forbidden响应。


我已经在Keycloak-Gatekeeper 8.0.05.0.0上尝试过,两者都有同样的问题。

  1. 这应该按照我尝试使用它的方式工作吗?
  2. 如果没有,我缺少什么?,我如何验证iss或绕过此验证?(最好是前者)?
0 投票
2 回答
1941 浏览

kubernetes - Keycloak 网守 HTTP 502 / 10 秒后超时

我使用 keycloak 网守作为连接到 keycloak 实例的代理来保护 kibana。所有工具都在私有 Kubernetes 集群中运行。使用以下 helm chart https://github.com/mvitale1989/helm-keycloak-gatekeeper安装了 keycloak 网守。

我注意到,通过长时间运行 kibana 查询(> 10 秒),我在 10 秒后得到 HTTP 502 错误网关。我使用“kubectl port-forward ....”直接连接到 kibana,并测试了一些长时间运行的查询并在 30 秒后超时。这就是为什么我认为 keycloak 看门人负责 HTTP 502 代码。我在 keycloak 网守实例的日志中找不到任何内容。

问题:对于持续时间超过 10 秒的上游请求,keycloak 网守中是否存在默认超时?如果是,我怎样才能将其更改为例如 30 秒?

非常感谢您!