0

我有一个 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 正在删除这些标头。

有谁知道如何设置这个?

4

1 回答 1

0

我设法解决了我自己的问题。存在问题是因为我为 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";
  }

这解决了问题!

于 2021-09-18T04:36:44.143 回答