API网关CORS问题

wmf*_*cia 4 amazon-web-services cors aws-api-gateway

所以我启用了CORS,完成了AWS Gateway提供的基本设置.但是对于此API,我需要允许所有请求的Control Origins并允许凭据.

这是它的样子

在此输入图像描述

您可能已经猜到的问题是CORS不允许此设置,您不能拥有Origin的通配符并且凭据为true.通常,解决此问题的方法是抓取请求域并将其添加到Origin Header中.这或多或少是我想要做的.但我不知道如何获取该信息并将其添加为映射值.API Gateway在哪里存储该信息以及如何获取该信息?

更新:我必须通过HTTP标头主机传递给我之前应该提到的Lambda函数,我已经尝试实现下面的答案,但我无法使用提供的说明访问标头将其传递给Lambda函数.我们非常感谢您提供更多帮助.

wmf*_*cia 5

好的经过几个小时的研究,并在互联网上找到一些信息,我有一个解决方案,希望它对其他人有用.

传递不是AWS API Gateway提供的默认值的HTTP标头,然后通过Lambda函数访问该数据并在响应标头中返回该数据,请按照以下步骤操作

  1. 在"方法请求"中,转到"HTTP请求标头"并添加所需的标头以进行捕获.即.如果我们想要获取API网址的主机值,您可以在此处输入"主机".如果你想让调用者的网站主机使用"Origin"

  2. 在"集成请求"中,如果"application/json"不存在,则转到映射模板并创建新模板,如果它只是更新它.

这是重要的部分,传递您在步骤1中设置的标题值.为此,请在模板框中编写类似于以下内容的内容.

{
   "origin" : "$input.params().header.Origin",
   "host" : "$input.params().header.Host"
}
Run Code Online (Sandbox Code Playgroud)

您还可以传入您在同一JSON中定义的任何url参数.

  1. 从Lambda访问数据,如果使用Node作为Lambda后端代码,则集成请求将信息传递到"Event"参数.要检索任何标头的值,只需在处理程序中使用以下内容即可.

    event.origin;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将您的响应从Lambda发送回API网关时,最好以JSON格式化响应.类似的东西.

    { 
       "origin" : event.origin,
       "host" : event.host,
       "nonHeaderOutput" : "Hello World"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在"集成响应"中,转到"标题映射",如果未列出您需要的标题,则可以将其添加到"方法响应"中,然后它将显示在此处.对于此示例,我使用了"Access-Control-Allow-Origin"并编辑了映射值integration.response.body.origin

  4. 现在转到"映射模板"并选择要使用的内容类型,然后编辑模板以通过将其添加到模板框来访问非标头响应

    $input.path("$.nonHeaderOutput")
    
    Run Code Online (Sandbox Code Playgroud)

现在,发送到API的标头可以在方法Response中使用.