问题标签 [louketo-proxy]
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.
keycloak - keycloak 网守不会阻止任何请求
我正在尝试在个人 api: 中使用 keycloak + keycloak-gatekeeper 进行授权api.mydomain.com
。到目前为止,我已经完成了:
- 在 keycloak 中创建了一个领域
MY-REALM
,keycloak 的 URL 是https://auth.mydomain.com confidential client
在同一领域中创建了一个Authorization Enabled
ON和Valid redirect URIS
:https://api.mydomain.com/ *- 创建了一个用户
- 在我的服务器内部https://api.mydomain.com指向 127.0.0.1:5000
- 127.0.0.1:5001 是“真正的 API”
- 使用此 config.yaml 配置 keycloak-gatekeeper:
现在,如果我在浏览器https://api.mydomain.com中访问,我将被重定向到https://auth.mydomain.com,要求输入用户名和密码。我提供在第 3 点创建的用户,并按预期再次重定向到https://api.mydomain.com。到目前为止,一切都很好。
问题在于授权部分的配置:在 keycloak -> Clients
-> <MY-API-CLIENT-ID>
-> Authorization
->Resources
我编辑默认策略以拒绝resource
/*中的每个请求,但我可以访问https://api 中的每个资源(URL)。 mydomain.com和以前一样。
我努力了:
- 按领域角色限制(只有管理员可以访问特定资源)。
- 受范围限制。
- 否定策略中的逻辑。
- 受客户角色限制。
- 祈祷。
- 哭。
当然,我已经Evaluate
在 keycloak 的 Tab 中尝试了上述所有组合,并且在此处有效地模拟了策略显示DENY。
那么我做错了什么?顺便说一句,在每次请求之后,这是来自 keycloak-gatekeeper 的日志:
任何想法将不胜感激。
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 并在用户通过正确身份验证时充当简单的代理?或者有什么我不明白的地方这是不可能的吗?
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 提供以下日志记录:
所以我们“无法找到用户的刷新令牌”,因为根据日志记录“没有找到会话状态”。
有人知道如何启用令牌刷新吗?
angular - 在 Angular 应用程序中保留标题
我正在开发一种架构,其中我的 Angular 前端连接到 Spring Boot 后端,并且前端可以通过 NGINX 访问。
在访问我的应用程序之前,必须对用户进行身份验证。
我使用 Keycloak 作为身份管理器,使用 keycloak-gatekeeper 作为代理 oauth,验证用户是否经过身份验证。
成功验证后,网守重定向(并发送带有身份信息的标头,例如:用户名、电子邮件、角色......)到我的前面,这是一个调用 spring boot API 以根据登录的用户检索信息的单个页面和它的作用。
问题是:API 没有收到 Gatekeeper 发送的任何这些标头。
我做了几个测试以知道我在哪里丢失了标头,我发现当我将 Gatekeeper 直接与 API 连接时,API 接收所有标头但是当我在两者之间添加角度应用程序时,后端仅接收标准标头,例如:主机,x-real-ip,x-forwarded-for,访问控制允许来源...)
似乎前面生成了一个新请求 - 带有默认标头 - 到后面并丢失了其他标头。
我如何保留这些标头以便我的 API 接收它们?
这是我的架构的图片:
谢谢大家的帮助
kubernetes - keycloak/louketo 网守——不会自动重定向到 keycloak 登录
我正在将网守/louketo 设置为浏览器应用程序的反向代理。我将代理部署为 kubernetes pod 中的 sidecar,在同一集群中的其他地方使用 keycloak(但通过公共 URL 访问)。Gatekeeper 位于 nginx 入口的后面,该入口执行 tls 终止。
[我已经尝试过最新的 louketo 版本和 fork oneconcern/keycloak-gatekeeper。有些差异,但问题是一样的,所以我认为这是我的配置的问题。]
网守,无论我如何设置配置,都会读取我领域的发现 url,但不会在登录时重定向。相反,它使用/oauth/authorize
路径重定向到我的上游应用程序。我可以手动强制我的应用程序再次重定向到 keycloak,但是从 keycloak 返回时,网守无法识别 cookie,并在重定向循环中捕获我。
似乎我犯了一些简单的配置错误,但我已经为此工作了两天,而且我束手无策。(甚至对 go 代码进行了额外的调试,但还没有对其进行足够的研究以真正知道它在做什么。)
我的配置(尝试了许多不同变体的最佳猜测):
入口服务https://dev.my-domain.com
并路由到端口 4000,这是身份验证代理边车。它使用 let-encrypt 证书设置,并终止 tls。我不在代理中使用 tls(我应该吗?)。端口 3000 的上游应用程序。Keycloak 位于 auth.my-domain.com。在auth-proxy-keycloak-config.yaml
我有加密密钥和client_id。keycloak 客户端是为公共访问和标准流程设置的(因此我认为不需要 client_secret)。我已经摆弄了各种 uri 设置,并且还为 CORS 输入了 web origins "*" 以进行测试。
当我在浏览器中尝试受保护的 url 时,我看到:
在代理日志中,它会将我重定向到 /oauth/authorize,而不是https://auth.my-domain.com/auth/realms/my-realm/protocol/openid-connect/auth
我认为它应该重定向我的位置。
更新——正如@jan-garaj 在评论中指出的那样,/oauth/*
不应该被列入白名单。(我从对其他人答案的一个可能错误的解释中得到了这一点。)然后我不得不使 cookie 不是 http-only,最后解决了这个问题 - Keycloak-gatekeeper: 'aud' claim and 'client_id' do not match。 ..之后它的工作原理!
jwt - Keycloak 如何在新的浏览器窗口中确定用户?
我试图理解以下问题:
有:
app1.gatekeeper-test.com
app2.other-url.com
这两个客户端(app1,app2)在同一个领域(受 2 个关守保护)都指向同一个资源服务器 - Cookie 是全范围的。
- 我
user1
以app1.gatekeeper-test.com
. - 我
app2.other-url.com
在一个新选项卡中打开它会自动将我登录为user1
. - 如果我
app1.gatekeeper-test.com
在私人窗口中打开,我需要再次登录。 - 没有什么是全局范围的,我找不到 keycloak 如何确定用户的原因。
这怎么可能?必须有一些前端状态机制让 Keycloak 知道,这是user1
,它正在尝试访问 app2?我很困惑......(在 Chrome 80.0.3987.87 上测试)
keycloak - 无法通过 ajax 请求调用受 Gatekeeper-keycloak 保护的 Web 服务
我有受网守(louketo-proxy)保护的网络服务。当我通过 ajax 请求调用受保护的服务时,它不会将我重定向到登录页面。它向我显示消息“跨域请求被阻止:同源策略不允许在http://127.0.0.1:3000/app-name/api/getSession读取远程资源。(原因:CORS 标头 'Access-Control-Allow -原点缺失)。”
下面是网守配置文件:
我使用的 Keycloak 版本是 10.0.2
keycloak - 无法从应用程序加载 keycloak 身份验证页面,使用 ajax 请求调用受保护资源
我已经为 IAM 配置了 keycloak,并使用网守作为代理。当我通过 ajax 请求从我的 Angular 应用程序调用受保护资源时,它不会将我重定向到 keycloak 的登录页面,尽管在浏览器请求中调用它显示我请求登录页面。任何帮助将非常感激。