AWS Api Gateway Lambada集成不适用于api键

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

带有Lambda集成的我的Api网关工作正常。但是,当我需要一个api键时,它不起作用。 “跨域请求被阻止:相同的原始策略不允许读取https://some-aws-api-gateway处的远程资源。(原因:缺少CORS标头'Access-Control-Allow-Origin')。”

一些发现:没有api键X-Api-Key的api网关对POSTMAN和Browser都适用。具有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'missing)。“
  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'不匹配”>
  5. 如果您注意到,一旦需要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));
    

带有Lambda集成的我的Api网关工作正常。但是,当我需要一个api键时,它不起作用。 “跨域请求被阻止:相同的原始策略不允许读取远程资源...

cors cross-browser aws-api-gateway api-gateway
1个回答
0
投票

问题已解决。问题的根源在于,我需要AWS Api Gateway控制台中OPTIONS方法的api密钥。但是,所有其他执行实际CRUD操作的方法,例如GETPOST必须具有true的“需要API密钥”。

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