如何在AWS API Gateway中生成Set-Cookie集成响应标头?

时间:2019-03-13 20:12:11

标签: amazon-web-services cookies http-headers aws-api-gateway api-gateway

我目前正在使用Amazon的API网关创建一个直接与DynamoDB交互的REST API(使用“ AWS服务”集成类型-中间没有lambda)。一切正常,除了我想在第一个响应上返回Set-Cookie标头,以用于随后对API的调用。

为简单起见(这里不考虑安全性),我想使用context.requestId作为 cookie的值。问题在于Set-Cookie标头不仅需要cookie的值,还需要更多的信息。至少它还需要Cookie的名称,形式为CookieName=CookieValue,实际上,我还想为其设置其他参数,例如到期日期。

但是,似乎无法结合在“标题映射值”中包含一些静态文本的上下文变量,因为我需要上述格式:https://docs.aws.amazon.com/apigateway/latest/developerguide/request-response-data-mappings.html#mapping-response-parameters

所以我的问题是:我可以在“标题映射值”框中添加任何内容来实现此行为吗?'id='+context.requestId相似,但有效吗?我也愿意使用其他设置方法,例如AWS CLI或导入OpenAPI文件。

作为参考,这是有问题的API网关输入框: enter image description here

2 个答案:

答案 0 :(得分:0)

简单的标头映射

关于响应> 标题映射> 映射值

AWS文档,第https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings-execution-console.html

  

对于“映射值”,请使用以下格式之一:

     

integration.response.header。标题名称,其中 header-name 是后端的单值响应标题的名称。例如,要返回后端响应的Date标头作为API方法响应的Timestamp标头,响应标头列将包含一个 Timestamp 条目,并且关联的映射值应该设置为 integration.response.header.Date 。   ...

因此,以上内容归结为 DynamoDB 支持的内容。然后通过查看文档https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#API_GetItem_ResponseElements

中的 GetItem 这样的API示例之一
HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{ response json excluded for brevity}

所以我可能会尝试在映射中使用x-amzn-RequestId标头值

integration.response.header.x-amzn-RequestId

其他响应可能不包含此标头,但在这种情况下,有可能启用请求跟踪,最终将回吐X-Amzn-Trace-Id header

还有什么可以映射的

AWS response param mapping docs提到了映射可用的语法:

+--------------------------------------+------------------------+
| Mapped Data Source                   | Mapping expression     |
+--------------------------------------+------------------------+
| Integration response header          | integration.response.header.PARAM_NAME |
| Integration response header          | integration.response.multivalueheader.PARAM_NAME |
| Integration response body            | integration.response.body |
| Integration response body (JsonPath) | integration.response.body.JSONPath_EXPRESSION |
| Stage variable                       | stageVariables.VARIABLE_NAME |
| Context variable                     | context.VARIABLE_NAME that must be one of the supported context variables. |
| Static value                         | 'STATIC_VALUE'. The STATIC_VALUE is a string literal and must be enclosed within a pair of single quotes. |
+--------------------------------------+------------------------+

我们还知道PARAM_NAME需要与同一文档页面上的正则表达式^[a-zA-Z0-9._$-]+$相匹配。

尽管没有显示连接的示例,所以即使支持'id='+context.requestId语法,也没有阻止其将来删除的东西。

另一种选择-映射模板

  

API网关使用Velocity Template Language (VTL)引擎为集成请求和集成响应处理正文映射模板。映射模板将方法请求有效负载转换为相应的集成请求有效负载,并将集成响应主体转换为方法响应主体。

关于AWS的指南-Use a Mapping Template to Override an API's Request and Response Parameters and Status Codes

模板可能类似于以下内容。我还没有测试过:

#set($cookieName = "id")
#set($cookieNameValSeparator = "=")
$input.json("$")
#set($context.responseOverride.header.Set-Cookie = "$cookieName$cookieNameValSeparator$context.requestId")

答案 1 :(得分:0)

如果您对使用AWS CloudFront感兴趣,这将使其变得非常简单。在CloudFront中,您可以添加带有名称和值的自定义标头,因为对于您的站点而言,请求已被最佳路由:

AWS CloudFront Origin Editing

希望这会有所帮助!