我使用API网关的代理集成来调用Lambda。输出格式规范如下JSON格式:
{
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
字符串
在一个响应中,我希望设置两个cookie(两个不同的auth cookie),但JSON不允许在headers
对象中有两个相同的键(好吧,技术上规范允许,但大多数库不允许)。
RFC 7230指出Set-Cookie应该被特殊处理,但我不知道如何通过API网关发送多个Set-Cookie值。
有人知道这是否可能吗?
7条答案
按热度按时间wgx48brx1#
**注意:**API网关现在有一个版本2的有效负载,与这里描述的(以及新API的默认值)有根本的不同。有关here差异的文档。有关更多详细信息,请参阅其他accepted answer from Samuel。
截至2018年11月,可以在响应中使用
multiValueHeaders
字段而不是headers
(参见announcement)。作为一个例子,而不是:
字符串
您可以回复:
型
请注意,您可以混合使用
headers
和multiValueHeaders
:型
然而,在两者中使用相同的头将意味着
headers
下的值被丢弃。有关详细信息,请参阅文档。
当只使用header字段(2018年11月之前可用)时,我尝试发送以下手动策划的JSON作为响应:
型
API网关响应于CURL请求返回的Cookie是:
型
正如你所看到的,第一个
Set-Cookie
掉在地板上。aelbi1ox2#
请注意,在09/2022中,AWS API Gateway默认使用新的有效负载格式(版本2.0),不再识别所有顶级答案(包括接受的答案)提出的
multiValueHeaders
。我刚刚花了40分钟试图弄清楚为什么它不返回我的cookie:)。AWS文档:
格式2.0没有multiValueHeaders或multiValueQueryStringParameters字段。重复的头与逗号组合并包含在头字段中。重复的查询字符串与逗号组合并包含在queryStringParameters字段中。
格式2.0包含一个新的cookie字段。请求中的所有cookie头都用逗号组合并添加到cookie字段中。在对客户端的响应中,每个cookie都成为一个set-cookie头。
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html
因此,实际的解决方案现在应该是:
字符串
oo7oh9g93#
正如所回答的,到目前为止,API网关将丢弃相同的密钥,只设置其中一个cookie。
但是,存在一种解决方法。您可以更改字符串
'Set-Cookie'
的大小写,使键不唯一。例如,您可以使用键set-cookie
,Set-cookie
,sEt-cookie
,并且头将被保留,并且将设置3个不同的cookie。因为RFC标准使头文件为case-insensitive,所以这应该适用于所有符合RFC的客户端。
所以,你可以重写你的set-cookie头,permuting all the possible casings of "Set-Cookie"来解决这个问题。
这种技术(hack)是employed by Zappa,一种用Python编写的流行的无服务器框架。
mrwjdhj34#
使用multiValueHeaders:
字符串
或者:
型
https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
insrf1ej5#
正如Mark B所指出的,您可以/应该通过在单个Set-Cookie标头中设置多个Cookie名称/值对来实现这一点。浏览器应该正确地解释这一点。
字符串
编辑:正如OP所指出的,有些用例需要多个头的示例。我们已经将其添加到我们的backlog中,沿着支持传入请求的多个头名称。
vom3gejh6#
晚了几年,但我只是需要实现这样的东西,这就是我如何能够使它工作:
字符串
每个数组项都将被独立处理,因此您可以使用不同的设置向数组中添加尽可能多的Cookie。
即
型
lkaoscv77#
对于使用API Gateway V2的用户,您可以使用
cookies
prop发送多个cookie。字符串