如何在nginx ingress上对特定的HTTP方法使用基本身份验证?

6

我可以使用基本认证创建入口点。我遵循了来自kubernetes/ingress-nginx的模板:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-with-auth
  annotations:
    # type of authentication
    nginx.ingress.kubernetes.io/auth-type: basic
    # name of the secret that contains the user/password definitions
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    # message to display with an appropriate context why the authentication is required
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /
        backend:
          serviceName: http-svc
          servicePort: 80

它运行良好,但是我需要允许 'OPTIONS' 方法在预检请求中不使用基本身份验证。任何有关如何做到这一点的指针都将非常有用。


你能解释一下为什么要允许认证和非认证流量吗? 你可以为另一个命名空间设置另一个 Ingress,以降低非认证流量。 - Crou
@Crou 我的前端团队向后端发送预检请求“OPTIONS”。他们在预检请求时没有认证凭据。因此,我需要允许不带基本身份验证的OPTIONS。我需要在同一主机上使用noauth。如果我设置另一个具有相同HOST的入口,ngnix入口将仅选择第一个入口并抱怨第二个入口。 - Shibu
你可以通过使用不同的“命名空间”将authnoauth分开,并为两者设置不同的入口。 - Crou
我有同样的用例,@Shibu,你最终解决了这个问题吗? - Bobbake4
2个回答

3

我遇到了同样的问题。我通过使用配置片段来解决它。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-cors-auth-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      # fix cors issues of ingress when using external auth service
      if ($request_method = OPTIONS) {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 204;
      }
      more_set_headers "Access-Control-Allow-Credentials: true";
      more_set_headers "Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS";
      more_set_headers "Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization";
      more_set_headers "Access-Control-Allow-Origin: $http_origin";
      more_set_headers "Access-Control-Max-Age: 600";
    nginx.ingress.kubernetes.io/auth-url: "http://auth-service.default.svc.cluster.local:80"

0
我遇到了同样的问题:一个配置了CORS的应用程序,但是在一个带有基本身份验证的k8s nginx ingress后面,这会导致预检请求失败。最后,我将我的CORS配置移到了ingress中。ingress上的注释完美地协同工作,以正确的方式响应预检请求。这解决了我的问题。
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/enable-cors: "true"

也可以查看https://github.com/kubernetes/ingress-nginx/issues/8964

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接