【发布时间】:2020-10-05 01:56:10
【问题描述】:
我的带有 Lambda 集成的 API 网关运行良好。但是,当我制作所需的 api 密钥时,它不起作用。 “跨源请求被阻止:相同的源策略不允许在 https://some-aws-api-gateway 读取远程资源。(原因:CORS 标头“Access-Control-Allow-Origin”缺失)。”
一些发现:
没有 api 密钥 X-Api-Key 的 Api 网关适用于 POSTMAN 和浏览器。带有 api 密钥的 API 网关仅适用于 POSTMAN。
我已经检查了多次标题,它们都是应该的。
{
"Access-Control-Allow-Origin":"*",
"Access-Control-Allow-Credentials":"true",
"Access-Control-Allow-Methods":"GET,OPTIONS",
"Access-Control-Allow-Headers":"Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
"Content-Type":"application/json"
}
我决定做一个实验。我所做的是删除 api 密钥要求并将"Access-Control-Allow-Origin":"*" 更改为"Access-Control-Allow-Origin":"https://example.com/")。现在来自浏览器的请求出现此错误:CORS 标头“Access-Control-Allow-Origin”与预期结果“https://example.com”不匹配。这对我来说只是意味着我在 AWS Api Gateway 中设置的标头是正确的。
到目前为止我所知道的:
-
"Access-Control-Allow-Origin":"*"不需要 api 密钥 WORKS -
"Access-Control-Allow-Origin":"*"使用 api 密钥 DOES NOT WORK,错误:“跨源请求被阻止:相同的源策略不允许在 https://some-aws-api-gateway 读取远程资源。(原因: 缺少 CORS 标头“Access-Control-Allow-Origin”)。” -
"Access-Control-Allow-Origin":"https://example.com"(或任何不同于来源的域)需要 api 密钥 不工作,错误:与 2 相同 -
"Access-Control-Allow-Origin":"https://example.com"没有 api 密钥 不起作用,错误:CORS 标头“Access-Control-Allow-Origin”与“https://example.com”不匹配
如果您注意到,一旦需要 api 密钥(2 和 3),您将收到相同的错误消息。
我的问题是为什么 CORS 在需要 api 密钥 (X-Api-Key) 时失败,但在不需要 api 密钥时通过?这使我相信 Api 网关上的 CORS 标头很好,但是,从浏览器请求验证 api 密钥的身份验证过程是问题所在。为什么需要 Api 密钥上缺少 CORS 标头 Access-Control-Allow-Origin?我想知道 api 键/标头是否需要编码为某种格式或其他东西。
var myHeaders = new Headers();
myHeaders.append("X-Api-Key", apiKey);
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow',
mode: 'cors',
credentials: 'include'
};
fetch("https://some-aws-api-gateway", requestOptions)
.then(response => response.json())
.then(result => console.dir(result))
.catch(error => console.log('error', error));
【问题讨论】:
标签: cors cross-browser aws-api-gateway api-gateway