keycloak/louketo gatekeeper -- 不会自动重定向到 keycloak 登录

keycloak/louketo gatekeeper -- doesn't automatically redirect to keycloak login

我正在将 gatekeeper/louketo 设置为浏览器应用程序的反向代理。我将代理部署为 kubernetes pod 中的 sidecar,在同一集群中的其他地方使用 keycloak(但由 public URL 访问)。 Gatekeeper 在 nginx ingress 后面,它执行 tls 终止。

[我已经尝试了最新的 louketo 版本和 fork oneconcern/keycloak-gatekeeper。有些不同,但问题是一样的,所以我认为是我配置的问题。]

网守,无论我如何设置配置,都会读取我的领域的发现 url,但不会在登录时重定向到那里。而是使用 /oauth/authorize 路径重定向到我的上游应用程序。我可以手动强制我的应用再次重定向到 keycloak,但是在来自 keycloak 的 return 上,看门人无法识别 cookie,并在重定向循环中抓住我。

看来我犯了一些简单的配置错误,但我已经为此工作了两天,而且已经无计可施了。 (甚至对 go 代码进行了额外的调试,但还没有足够的研究来真正了解它在做什么。)

我的配置(尝试了许多不同变体的最佳猜测):

        - --config=/var/secrets/auth-proxy-keycloak-config.yaml
        - --discovery-url=https://auth.my-domain.com/auth/realms/my-realm
        - --listen=:4000
        - --upstream-url=http://127.0.0.1:3000
        - --redirection-url=https://dev.my-domain.com/
        - --enable-refresh-tokens=true
        - --enable-default-deny=true
        - --resources=uri=/*|roles=developer
        - --resources=uri=/about|white-listed=true
        - --resources=uri=/oauth/*|white-listed=true

入口服务 https://dev.my-domain.com 并路由到端口 4000,这是身份验证代理边车。它使用 lets-encrypt 证书设置,并终止 tls。我不在代理中使用 tls(我应该吗?)。上游应用程序在端口 3000。Keycloak 在 auth.my-domain.com。在 auth-proxy-keycloak-config.yaml 中,我有加密密钥,在 client_id 中。 keycloak 客户端设置为 public 访问和标准流程(因此我认为不需要 client_secret)。我摆弄了各种uri设置,还为CORS添加了网络源“*”进行测试。

当我在浏览器中尝试受保护的 url 时,我看到:

no session found in request, redirecting for authorization  {"error": "authentication session not found"}

在代理日志中,它将我重定向到 /oauth/authorize,而不是我认为应该重定向我的 https://auth.my-domain.com/auth/realms/my-realm/protocol/openid-connect/auth

UPDATE——正如@jan-garaj 在评论中指出的那样,/oauth/* 不应该被列入白名单。 (我从对其他人的回答的可能错误的解释中得到了这一点。)然后我不得不让 cookie 不仅仅是 http,最后解决了这个问题 - ......之后它起作用了!

来自 Louketo-proxy 文档:

/oauth/authorize is authentication endpoint which will generate the OpenID redirect to the provider

所以重定向是正确的。它是 louketo-proxy 端点。这不是您的应用程序的请求,它将由 louketo-proxy 处理。它将生成另一个重定向到您的 IDP,用户需要在此处登录。

题外话:

  • 授权代码流确实需要保密的客户端和客户端密码
  • CORS 的网络来源“*”仅适用于 http 协议,https 需要明确的来源规范