AWS Lambda HTTP API网关集成无法实现CORS

时间:2020-04-13 13:18:48

标签: amazon-web-services aws-lambda cors aws-api-gateway

创建了一个返回3个HTTP标头的AWS Lamba函数(NodeJS):aaa,Access-Control-Allow-Origin和bbb:

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        headers: { "aaa":"aaa", "Access-Control-Allow-Origin":"*", "bbb":"bbb" },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

该功能已集成到HTTP API(不是REST API)中。在HTTP API网关配置的“配置CORS”部分中,HTTP标头“ Access-Control-Allow-Origin”设置为“ *”。请查看屏幕截图:

Gateway Config

命令“ curl -i https://xxxxxxxxxx.execute-api.eu-central-1.amazonaws.com”证明已明确删除了HTTP标头Access-Control-Allow-Origin,因为仅返回了HTTP标头aaa和bbb:

HTTP/2 200 
date: Tue, 14 Apr 2020 11:01:58 GMT
content-type: text/plain; charset=utf-8
content-length: 20
aaa: aaa
bbb: bbb
apigw-requestid: K-S2EjVWliAEJKw=

为什么即使执行了“配置CORS”后,此标头仍然不存在?

(我正在谷歌搜索超过两天,以便找到解决方案,这让我发疯了)

3 个答案:

答案 0 :(得分:3)

根据Configuring CORS for an HTTP API-

如果为API配置CORS,则API Gateway会忽略CORS标头 从您的后端集成返回。

这就是为什么忽略Lambda(集成)中的CORS标头的原因。这是原始REST API与新HTTP API之间的区别之一。如果使用这些API-

对于CORS请求,API网关将已配置的CORS标头添加到 集成的响应。

进行简单卷曲时,实际上并不是在进行跨域请求。因此,您看不到HTTP API设置的CORS标头。为了验证CORS请求是否有效,我在以下请求中传递了 Origin 标头,然后可以看到CORS标头以及Lambda中的自定义标头-

$ curl -v -X GET https://$API_ID.execute-api.$AWS_REGION.amazonaws.com -H "Origin: https://www.example.com"

< HTTP/2 200
< date: Tue, 14 Apr 2020 18:02:26 GMT
< content-type: text/plain; charset=utf-8
< content-length: 18
< aaa: aaa
< bbb: bbb
< access-control-allow-origin: https://www.example.com
< access-control-expose-headers: date, x-api-id

以下是我在API上的CORS配置的摘录。我将Access-Control-Allow-Origin值添加为https://www.example.com,并将其作为我的curl请求中Origin头文件的一部分传递。这样的请求将被视为CORS。

enter image description here

答案 1 :(得分:3)

对于 Google 员工:

如果您的 OPTIONS 预检成功但不存在 Access-Control- 标头,并且您正在使用 CURL 进行测试,请特别注意拼写所需的标头以用于预检:

如果拼写错误,OPTIONS 会以 204 No Content 成功,但没有 Access-Control- 标头因此导致预检结果无效。

还要检查您是否有足够的参数范围,只要您请求的方法和标头是参数的子集,您将获得 Access-Control- 标头。如果没有,您将得到 204 No Content,我会说这不是很有用!

答案 2 :(得分:0)

对于POST / PUT请求,您需要将content-type标头列入白名单。 由于某些原因,放置通配符并不能解决问题,您需要将其明确列入白名单。

apigw configuration