当响应为 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 身份验证方案?
Android:当密码错误时,带有 Authenticator 的 HttpsUrlConnection 将永远迭代(在 401 响应中)