所以我启用了CORS,完成了AWS Gateway提供的基本设置。但是对于此API,我需要为所有请求允许Control Origins并允许凭据。
这是它的样子
您可能已经猜到的问题是CORS不允许此设置,您不能拥有Origin的通配符并且凭据为true。通常,解决此问题的方法是抓取请求域并将其添加到Origin Header中。这或多或少是我想要做的。但我不知道如何获取该信息并将其添加为映射值。 API Gateway在哪里存储该信息以及如何获取它?
更新: 我必须通过HTTP头主机传递给我之前应该提到的Lambda函数,我已经尝试实现下面的答案,但是我无法使用提供的指令访问头文件将其传递给Lambda函数。我们非常感谢您提供更多帮助。
答案 0 :(得分:5)
好的经过几个小时的研究并在互联网上找到一些信息,我有一个解决方案,希望它对其他人有用。
传递不是AWS API Gateway提供的默认值的HTTP标头,然后通过Lambda函数访问该数据并在响应标头中返回该数据,请按照以下步骤操作
In" Method Request"转到" HTTP请求标头"并添加您想要的标题以捕获。即。如果我们想获得API网址的主机价值,您可以输入" Host"这里。如果你想让主叫方的网站主持人使用" Origin"
In" Integration Integration"转到映射模板并创建一个新模板,如果" application / json"如果只是更新它,则不存在。
这是重要的部分,传递您在步骤1中设置的标题值。为此,请在模板框中编写类似于以下内容的内容。
{
"origin" : "$input.params().header.Origin",
"host" : "$input.params().header.Host"
}
您还可以传入您在同一JSON中定义的任何url参数。
从Lambda访问数据,集成请求将信息传递到"事件"如果使用Node作为Lambda后端代码,则参数。要检索任何标题的值,只需在处理程序中使用以下内容。
event.origin;
将您的响应从Lambda发送回API网关时,最好使用JSON格式化响应。类似的东西。
{
"origin" : event.origin,
"host" : event.host,
"nonHeaderOutput" : "Hello World"
}
In" Integration Response"转到" Header Mappings",如果未列出您需要的标题,您可以将其添加到"方法响应"然后它会出现在这里。在这个例子中,我使用了" Access-Control-Allow-Origin"并将映射值编辑为integration.response.body.origin
现在转到"映射模板并选择要使用的内容类型,然后通过将此模板框添加到模板框来编辑模板以访问非标题响应
$input.path("$.nonHeaderOutput")
现在,发送到API的标头可以在方法Response中使用。
答案 1 :(得分:3)
来自API Gateway的Jurgen。 感谢您报告此问题。目前没有简单的方法通过控制台中的“启用CORS”功能进行设置。但是,我们正在研究它以改善此用例的用户体验。
作为一种潜在的解决方法,您可以将Origin标头从客户端传递到后端,并在那里解析/创建Access-Control-Allow-Origin标头的值。然后,您将集成响应中的标头从“integration.response.header.Access-Control-Allow-Origin”映射到Access-Control-Allow-Origin并将其返回给客户端。
希望这会有所帮助。
最佳, 尔根