API网关CORS问题

时间:2016-02-08 19:28:00

标签: amazon-web-services cors aws-api-gateway

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

这是它的样子

enter image description here

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  1. In" Method Request"转到" HTTP请求标头"并添加您想要的标题以捕获。即。如果我们想获得API网址的主机价值,您可以输入" Host"这里。如果你想让主叫方的网站主持人使用" Origin"

  2. In" Integration Integration"转到映射模板并创建一个新模板,如果" application / json"如果只是更新它,则不存在。

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

    {
       "origin" : "$input.params().header.Origin",
       "host" : "$input.params().header.Host"
    }
    

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

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

      event.origin;
      
    2. 将您的响应从Lambda发送回API网关时,最好使用JSON格式化响应。类似的东西。

      { 
         "origin" : event.origin,
         "host" : event.host,
         "nonHeaderOutput" : "Hello World"
      }
      
    3. In" Integration Response"转到" Header Mappings",如果未列出您需要的标题,您可以将其添加到"方法响应"然后它会出现在这里。在这个例子中,我使用了" Access-Control-Allow-Origin"并将映射值编辑为integration.response.body.origin

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

      $input.path("$.nonHeaderOutput")
      
    5. 现在,发送到API的标头可以在方法Response中使用。

答案 1 :(得分:3)

来自API Gateway的Jurgen。 感谢您报告此问题。目前没有简单的方法通过控制台中的“启用CORS”功能进行设置。但是,我们正在研究它以改善此用例的用户体验。

作为一种潜在的解决方法,您可以将Origin标头从客户端传递到后端,并在那里解析/创建Access-Control-Allow-Origin标头的值。然后,您将集成响应中的标头从“integration.response.header.Access-Control-Allow-Origin”映射到Access-Control-Allow-Origin并将其返回给客户端。

希望这会有所帮助。

最佳, 尔根