Kubernetes 上 traefik 背后的 Keycloak CORS

Keycloak CORS behind traefik on Kubernetes

我们目前使用 Keycloak 作为 Traefik 1.7 背后的 IDP 的 Web 应用程序面临以下问题:

Chrome 控制台告诉我们:

Access to manifest at 'https://keycloak.dev.example.com/auth/realms/myrealm/protocol/openid-connect/auth?client_id=myclient&redirect_uri=...' (redirected from 'https://myfrontend.dev.example.com/manifest.json') from origin 'https://myfrontend.dev.example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

在 keycloak 中,我们为 myrealm 领域内的客户端 myclient 设置 Web Origins = *。

我们已经尝试将 https://myfrontend.dev.example.com 设置为网络来源。那没有帮助。

我们在部署 keycloak 的命名空间内配置了 Ingress。添加注释:

ingress.kubernetes.io/cors-allow-origin: https://myfrontend.dev.example.com
ingress.kubernetes.io/enable-cors: "true"

没有帮助。

过去我们只使用相同的子域与 IDP 进行设置。当然,这将防止任何 CORS 问题,但我们想将其分开。

关于在何处添加配置以应用 CORS-related headers 的任何建议? 谢谢。

AFAIK * 在这种情况下是不允许的。设置前端域时,尝试在末尾添加/*

https://myfrontend.dev.example.com/*

如果这仍然不起作用,请查看 keycloak 日志以及 Chrome devtools 中的响应 headers 以及 post 他们对您的问题的响应。

经过几个小时的分析,不明白这里发生了什么:

  • 将网络来源设置为 * 是可以的,虽然我建议将其明确设置为正确的来源,这里:https://myfrontend.dev.example.com(没有 Stuck 的回答中的 /*)
  • 如果我们在 cross-origin 请求中检查 /token 端点,它会起作用,因为预期的响应 headers 已设置
  • 但是:这里的问题出现在 /auth 端点

因此,无论谁遇到这个问题,10/2020 版本 11.x 中的 Keycloak 根本不支持 /auth OpenID-connect OIDC 端点上的 CORS。这不是 OIDC 规范的要求,因此 Keycloak(和其他工具)在这里不支持 CORS。

如果我们设置 Web Origin 并启用 CORS,它将适用于某些端点,例如/token,但有些不是,例如/授权。 这是因为 /auth 被算作一个 user-only 端点,用户会明确请求或者用户会被重定向到,而不是前端应该以某种方式在后台发送请求到。

我们在应用程序的一部分中实施了错误的工作流程。不是 keycloak(或 traefik 或 kubernetes)问题。

请在此处查看此讨论以获取任何功能更新: https://keycloak.discourse.group/t/authorizationendpoint-does-not-support-cors/3495