簡體   English   中英

如何在AWS API Gateway中生成Set-Cookie集成響應頭?

[英]How can I generate a Set-Cookie integration response header in AWS API Gateway?

我目前正在使用亞馬遜的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網關輸入框: 在此輸入圖像描述

簡單的標頭映射

有關響應 > 標題映射 > 映射值的 AWS文檔,請參見 https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings-execution-console.html

對於映射值,請使用以下格式之一:

integration.response.header。 header-name其中header-name是后端的單值響應頭的名稱。 例如,要將后端響應的Date標頭作為API方法的響應的Timestamp標頭返回, Response標頭列將包含Timestamp條目,並且關聯的Mapping值應設置為integration.response.header.Date ...

因此,上面歸結為DynamoDB支持的內容 通過在文檔https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html#API_GetItem_ResponseElements中查看其中一個API示例,例如GetItem

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標頭

還有什么可以映射

AWS響應參數映射文檔提及映射的可用語法:

+--------------------------------------+------------------------+
| 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上有一個指南 - 使用映射模板覆蓋API的請求和響應參數和狀態代碼

模板看起來類似於下面。 我沒有測試過它:

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

如果您對使用AWS CloudFront感興趣,那么這將非常簡單。 在CloudFront中,您可以添加自己的名稱和值自定義標頭,因為請求最適合您的網站:

AWS CloudFront Origin Editing

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM