首页 > 解决方案 > 带有健康检查的nestjs enableCors

问题描述

我的 API 集群在 Kubernetes 下。

    if (!configService.isProduction()) {
        app.enableCors();
    } else {
        const whitelist = ['https://sub. domain .com', 'https:// www.domain .com', 'undefined'];
        app.enableCors({
            origin: function (origin, callback) {
                if (whitelist.indexOf(origin) !== -1) {
                    console.log("allowed cors for:", origin)
                    callback(null, true)
                } else {
                    console.log("blocked cors for:", origin)
                    callback(new Error('Not allowed by CORS'))
                }
            },
            allowedHeaders: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Observe',
            methods: "GET,PUT,POST,DELETE,UPDATE,OPTIONS",
            credentials: true,
        });
    }

这里的问题是,当 Kubernetes 上的部署尝试运行健康检查并在origin失败时,origin 返回未定义。添加到我的白名单未定义值中,它不起作用。

限制对我的 API 的访问的最佳方法是什么?

标签: node.jskubernetesnestjshealth-check

解决方案


原始标头可以在非浏览器环境中伪造,因此使用 CORS 来尝试防止对您的 API 的未经授权的访问并不是一个安全的解决方案。

CORS 专门用于防止浏览器向没有适当 CORS 标头的服务器发出跨域请求。它不是为了保护服务器而设计的;它旨在保护浏览器和用户。

假设您实际上想要保护和验证您的 api,您有几个简单的选择:

  1. 删除健康检查端点的身份验证(不推荐)
  2. 使用 livenessProbe 中的 HTTP 标头对 Kubernetes 进行身份验证:

像这样的东西应该工作。请注意,您可以在此处使用任何类型的身份验证标头。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        # Add basic auth, or any other auth mechanism you want here:
        # Make sure to use your own user:password in Base64 if you copy/paste
        httpHeaders:
        - name: Authorization
          value: Basic dXNlcjpwYXNzd29yZA==
      initialDelaySeconds: 3
      periodSeconds: 3

还有其他方法可以实现这一点,但如果没有关于集群其余部分的更多信息,很难为您提供更好的答案。

我还强烈建议您不要拒绝使用该origin功能的请求。一般来说,那是用来动态配置CORS白名单的,error用来表示配置的时候出了点问题。它给人一种虚假的安全感,因为原始标头可以被任何非浏览器请求库欺骗。

是关于 CORS 及其用途的一个很好的答案。


推荐阅读