当响应为 401 时,如何为 Kubernetes Ingress Nginx auth-url 设置 CORS?

Posted

技术标签:

【中文标题】当响应为 401 时,如何为 Kubernetes Ingress Nginx auth-url 设置 CORS?【英文标题】:How to setup CORS for Kubernetes Ingress Nginx auth-url when response is 401? 【发布时间】:2021-11-12 19:11:02 【问题描述】:

我有这样的 Kubernetes Ingress 设置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /hello/$1
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/auth-url: http://external-auth/authenticate
    nginx.ingress.kubernetes.io/auth-response-headers: X-MemberId
    nginx.ingress.kubernetes.io/auth-method: GET
    nginx.ingress.kubernetes.io/configuration-snippet: |
      error_page 401 = @unauthorized;
    nginx.ingress.kubernetes.io/server-snippet: |
      location @unauthorized 
        return 401 "Unauthorized";
      
spec:
  ...

当请求成功通过身份验证时,CORS 工作正常,但当身份验证失败(外部身份验证以 HTTP 401 响应)时,似乎没有随响应发送的 CORS 标头。

我尝试将我的外部身份验证服务配置为也响应 CORS 标头,但似乎 nginx 正在删除这些标头。

有人知道怎么设置吗?

【问题讨论】:

【参考方案1】:

我设法解决了我自己的问题。存在问题是因为我为 HTTP 401 配置了一个自定义错误页面,其中包含以下两行:

nginx.ingress.kubernetes.io/configuration-snippet: |
  error_page 401 = @unauthorized;
nginx.ingress.kubernetes.io/server-snippet: |
  location @unauthorized 
    return 401 "Unauthorized";
  

如果我设置自定义错误页面nginx.ingress.kubernetes.io/enable-cors: "true" 将不会对 401 响应生效。

解决方法是修改自定义错误页面位置,配置如下:

nginx.ingress.kubernetes.io/server-snippet: |
  location @unauthorized 
    # cors for 401 responses
    add_header "Access-Control-Allow-Origin" "*" always;
    return 401 "Unauthorized";
  

这解决了问题!

【讨论】:

以上是关于当响应为 401 时,如何为 Kubernetes Ingress Nginx auth-url 设置 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 url 配置 grails/spring 身份验证方案?

如何为一元 rpc 定义响应标头

如何为 Kubernetes 作业设置时间限制?

如何为 Kubernetes 创建本地开发环境?

Android:当密码错误时,带有 Authenticator 的 HttpsUrlConnection 将永远迭代(在 401 响应中)

当服务器返回 401 响应时,请求的资源上不存在“Access-Control-Allow-Origin”标头