我的 API 网关与 Lambda 集成工作正常。但是,当我要求 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 密钥不起作用,错误:“跨源请求被阻止:同源策略不允许读取 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),您将收到相同的错误消息。
我的问题是为什么当需要 api 密钥 (
X-Api-Key
) 时 CORS 失败,但当不需要 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));
问题已解决。问题的根源是我需要 AWS Api Gateway 控制台中的
OPTIONS
方法的 api 密钥。然而,执行实际 CRUD 操作的所有其他方法,例如。 GET
和 POST
必须将“需要 API 密钥”设置为 true
。
因此,在 OPTIONS 方法的方法请求面板中将“需要 API 密钥”设置为
false
。有关更多信息,您可以查看此 aws 论坛主题此处。
如果一切看起来正常但 api 密钥仍然不起作用,您可能需要修改您的 aws api 网关帐户: