我在Kubernetes集群中遇到了oauth2 proxy和Ingress Nginx(最新版本)的问题,其中X-Auth-Request
头在标准oauth身份验证流程中没有传递到客户端。我特别使用Azure作为身份验证提供程序。
下面是我的oauth代理配置的相关部分:
pass_access_token = true
pass_authorization_header = true
pass_user_headers = true
set_xauthrequest = true
当我显式调用/oauth2/auth
时,我得到了预期的头。但是,在标准OAuth2认证流程中,任何请求都不会返回任何头。
这种情况有点类似于这里的另一个问题:Oauth2-Proxy do not pass X-Auth-Request-Groups header,但在我的例子中,我没有收到任何X-Auth-Request
头,除非我直接调用/oauth2/auth
。
我还尝试将以下代码片段添加到我的应用程序Ingress配置中,但没有成功:
nginx.ingress.kubernetes.io/configuration-snippet: |
auth_request_set $email $upstream_http_x_auth_request_email;
access_by_lua_block {
if ngx.var.email ~= "" then
ngx.req.set_header("X-Auth-Request-Email", ngx.var.email)
end
}
我已经经历了多个配置,阅读了许多博客文章,并搜索了GitHub问题,但无法解决这个问题。有人知道是什么导致了这种行为吗?
2条答案
按热度按时间pod7payv1#
您确实有一个Kubernetes Ingress资源,用于管理对集群中服务的外部访问。这通常在YAML文件中定义,并使用
kubectl apply -f <filename.yaml>
应用于Kubernetes集群。类似于(为其他读者提到的):
在
annotations
部分,您可以指定Nginx Ingress Controller应该应用的各种设置。我建议,从kubernetes/ingress-nginx注解外部认证:(And
kubectl apply -f <your-ingress-config>.yaml
)这将显式地告诉Ingress从身份验证响应中选择这些头并将它们传递给上游应用程序。
这样做会更新Kubernetes集群中的Ingress资源,随后应该更新Nginx Ingress Controller的配置。在应用之后,给予一些时间来传播,然后您可以检查
X-Auth-Request
头是否如您所期望的那样被传递。如果没有,并且
kubectl logs <nginx-ingress-pod>
输出中没有任何明显的内容,请检查OAuth2代理日志(kubectl logs <oauth2-proxy-pod>
),以查看是否按预期生成了头(因为如果没有...再多的Lua脚本也不会改变最终结果)。kuarbcqp2#
这样就行了
唯一的缺点是,它会将头添加到所有的HTTP请求中,即使是CSS/JS文件