带有Ingress nginx的oauth2代理在标准身份验证流期间不传递X-Auth-Request标头

xpszyzbs  于 2023-10-15  发布在  Nginx
关注(0)|答案(2)|浏览(123)

我在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问题,但无法解决这个问题。有人知道是什么导致了这种行为吗?

pod7payv

pod7payv1#

您确实有一个Kubernetes Ingress资源,用于管理对集群中服务的外部访问。这通常在YAML文件中定义,并使用kubectl apply -f <filename.yaml>应用于Kubernetes集群。
类似于(为其他读者提到的):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    # annotations go here
spec:
  rules:
  - host: myapp.mydomain.com
    http:
      paths:
      - backend:
          service:
            name: my-service
            port:
              number: 80

annotations部分,您可以指定Nginx Ingress Controller应该应用的各种设置。我建议,从kubernetes/ingress-nginx注解外部认证:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
    nginx.ingress.kubernetes.io/auth-response-headers: "x-auth-request-user, x-auth-request-groups, x-auth-request-email"
spec:
  rules:
  - host: myapp.mydomain.com
    http:
      paths:
      - backend:
          service:
            name: my-service
            port:
              number: 80

(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脚本也不会改变最终结果)。

kuarbcqp

kuarbcqp2#

这样就行了

nginx.ingress.kubernetes.io/configuration-snippet: |
      auth_request_set $email $upstream_http_x_auth_request_email;
      
      add_header X-Auth-Request-Email $email;

唯一的缺点是,它会将头添加到所有的HTTP请求中,即使是CSS/JS文件

相关问题