AWS Api Gateway Lambda 集成无法使用 api 密钥

问题描述 投票:0回答:2

我的 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 中设置的标头是正确的。

目前我所知道的:

  1. "Access-Control-Allow-Origin":"*"
    ,无需 api 密钥 WORKS
  2. "Access-Control-Allow-Origin":"*"
    ,使用 api 密钥不起作用,错误:“跨源请求被阻止:同源策略不允许读取 https://some-aws-api-gateway 处的远程资源。(原因:CORS 标头” Access-Control-Allow-Origin' 缺失)。”
  3. "Access-Control-Allow-Origin":"https://example.com"
    (或任何与来源不同的域),需要 api 密钥不起作用,错误:与 2 相同
  4. "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));
cors cross-browser aws-api-gateway api-gateway
2个回答
2
投票

问题已解决。问题的根源是我需要 AWS Api Gateway 控制台中的

OPTIONS
方法的 api 密钥。然而,执行实际 CRUD 操作的所有其他方法,例如。
GET
POST
必须将“需要 API 密钥”设置为
true

因此,在 OPTIONS 方法的方法请求面板中将“需要 API 密钥”设置为

false
。有关更多信息,您可以查看此 aws 论坛主题此处


0
投票

如果一切看起来正常但 api 密钥仍然不起作用,您可能需要修改您的 aws api 网关帐户:

https://repost.aws/questions/QUldESbidUTYC-CKC4cTpLmw/api-gateway-execution-failed-resource-forbidden- due-to-invalid-api-key

© www.soinside.com 2019 - 2024. All rights reserved.