在 Lambda 代理集成中使用多个相同的标头字段

问题描述 投票:0回答:3

我正在编写一个 Lambda 函数,该函数返回 Python 中的 Lambda 代理集成 的响应。 API 期望标头是字典。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

这要求每个标头字段都是唯一的,因此无法使用多个

Set-Cookie
。 我已经尝试将字典转换为元组列表

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": [ ("headerName": "headerValue"), ... ],
    "body": "..."
}

但 API 网关抱怨

Malformed Lambda proxy response

知道如何设置同名的标题吗?

amazon-web-services aws-lambda aws-api-gateway
3个回答
2
投票

目前无法通过 lambda 集成发送多个 cookie。

如果您发送多个set-cookie,那么它将采用最后一个。好吧,这样的垃圾实现对吧。

参考,如何使用代理 Lambda 从 API Gateway 发送多个 Set-Cookie 标头

让我们看看其他可用的选项,

Lambda@Edge:

这是我发现与 Lambda@Edge 合作的结果,

您可以为查看者响应创建 lambda 函数并修改标头以设置 cookie。

'use strict';

exports.handler = (event, context, callback) => {
   const response = event.Records[0].cf.response;
   const headers = response.headers;

   // send via a single header and split it into multiple set cookie here.
   headers['set-Cookie'] = 'cookie1';
   headers['Set-Cookie'] = 'cookie2';

   callback(null, response);
};

API网关集成请求映射:

这是我发现并处理集成请求的内容,

希望有帮助。


1
投票

Lambda@Edge:

可以这样设置标题:

response.headers['set-cookie'] = [
  { key: 'Set-Cookie', value: 'cookie1=value1' },
  { key: 'Set-Cookie', value: 'cookie2=value2' },
]

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-struct.html#lambda-event-struct-response

API网关:

使用多值标头:

response.multiValueHeaders = {
  "Set-Cookie": [
    'cookie1=value1',
    'cookie1=value1'
  ]
}

https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format


0
投票

我也无法让多值示例起作用。我受到启发而写了这个:

// Lambda only allows one value per header, so to set multiple cookies
// we must set multiple case variations between "set-cookie" and "SET-COOKIE". 
// There are 512 combinations, which should be enough.
function AwsSetCookie(aws, cookie, count)
{
    let b = count.toString(2);
    if(b.length < 9) b = "0".repeat(9-b.length)+b
    const key = "set-cookie"
    let bp = 0;
    let kp = 0;
    let keyOut = "";
    while(kp < key.length)
    {
        let c = key.charAt(kp);
        if(c !== "-") {
            if(b.charAt(bp) === "1") c = c.toUpperCase();
            bp++;
        }
        keyOut += c;
        kp++;
    }
    aws.headers[keyOut] = cookie;
}
© www.soinside.com 2019 - 2024. All rights reserved.