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