CORS 如何在 AWS、NodeJs 和其他 Web 服务中工作? [复制]

Posted

技术标签:

【中文标题】CORS 如何在 AWS、NodeJs 和其他 Web 服务中工作? [复制]【英文标题】:How does CORS work in AWS, NodeJs and other web services? [duplicate] 【发布时间】:2019-04-01 18:50:27 【问题描述】:

我正在处理一个 AWS 项目,并注意到为了允许 CORS,我的前辈设置了 headers 属性Access-Control-Allow-Origin 作为响应。所以整个反应是这样的:

module. exports.handlerFunction = async ( event, content) => 
    // code here for DB calls and other logic
    return 
        headers: 
            "Access-Content-Allow-Origin" : "*"
        ,
        statusCode: 200,
        body: result
    ;

我的想法是,它是如何工作并允许 CORS 的?如果我们不想让 origin 执行任何操作并且已经完成 "Access-Content-Allow-Origin": "https://example.com".

由于我们将其设置为响应,因此不应该做任何事情而只是返回的原点现在已经完成了所有事情,然后以 CORS 错误响应。我问我的前辈,“这是如何工作的以及 CORS 是如何工作的?”,响应是它的浏览器属性和浏览器发送飞行前请求并检查 CORS。但是我们在最后检查 CORS,一旦每件事都完成,飞行前请求是如何跳过我们所有的检查 DB 和 API 调用并最终降落并检查响应头的。他们没有回答,并说同样的飞行前概念。我问了下一个问题“浏览器有预检概念来检查 CORS,邮递员、cUrl 请求以及通过 NodeJs 中的各种程序(如 node-fetch、request、https API 调用模块)进行 API 调用呢?航班呼叫”

另外,当我创建我的 NodeJs express Server 应用程序时,我使用了 cors.js 一个 NPM 模块。有了这个,我在进入任何 API 函数之前检查了 CORS,在每次调用进入时,只允许允许的源进入。代码如下:

const CORS = require('cors'),
      express = require('express');

const app = express();

let allowedOrigin = ['https://example.com'];

let corsOps = 
    origin: (origin, cb) => 
        if (allowedOrigin.includes(origin))
            cb(null, true);
        else
            cb(new Error('Not allowed'));
   
;

app.use(CORS(corsOps));

这在调用任何函数之前检查,而不是在响应时检查。

我对这种行为进行了很多搜索,并看到了多个在标头中使用 CORS 的示例,它甚至在标头中如何工作?

对我来说,是我的后端停止调用并检查谁在调用后端 API。

提出请求的人如何在标头和后端设置属性,仅通过查看标头属性而不检查调用的源来向任何人开放其访问权限?

【问题讨论】:

【参考方案1】:

当浏览器执行 AJAX 调用时,它们首先检查目标源是否与当前源相匹配,即window.location.origin。如果不是,他们检查目标源是否接受 window.location.origin 作为 CORS 请求的源。如果没有,浏览器会显示臭名昭著的No 'Access-Control-Allow-Origin' header is present on the requested resource. 错误消息。

如果可以发出请求,浏览器会在 HTTP 请求中包含Origin 标头,其值为window.location.origin

有多种方法可以在后端设置 CORS 政策:

    使用通配符接受所有来源 只接受一组预配置的来源 在逐个请求的基础上动态地将Origin 标头的值作为"Access-Content-Allow-Origin 的值

在最后一种情况下,来源可能明显被欺骗,如下所示:

curl -H"Origin: https://www.example.com" https://api.example.com/some/path

服务器是否应该为请求提供服务显然不应取决于Origin 标头,而是取决于其他因素,例如Authorization 标头或适当的授权Cookie;请求参数的有效性等

【讨论】:

以上是关于CORS 如何在 AWS、NodeJs 和其他 Web 服务中工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

请求太重时出现 NodeJS CORS 错误(文件上传)

无服务器 aws httpApi cors 设置

如何在 API Gateway 和 React 应用程序之间启用 AWS 中的 CORS 策略?

如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS

从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误

如何在 NodeJS 14 中允许 CORS