【问题标题】:Setting Cookie in http response header from AWS lambda Node JS在来自 AWS lambda Node JS 的 http 响应标头中设置 Cookie
【发布时间】:2019-06-21 20:30:58
【问题描述】:

我启用了 Lambda 代理集成,并将响应标头设置为 Lambda 输出的一部分,API 网关将它们作为 HTTP 响应的一部分返回给客户端。

示例代码:

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
});

我需要在标题中发送 3 个 cookie。我试过了。但是,失败了:

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "Set-Cookie": [cookie1String, cookie2String, cookie3String] },
    "body": "..."
});

[编辑] 我连接了 cookie 并作为响应传入,客户端获取 cookie。但是当客户端在“location”中调用target时,请求的header中没有cookie。

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "Set-Cookie": c1=cookie1String;c2=cookie2String; c3=cookie3String] },
    "body": "..."
});

请帮助将这 3 个 cookie 发送给我的客户。

【问题讨论】:

    标签: node.js amazon-web-services lambda aws-lambda aws-api-gateway


    【解决方案1】:

    使用multiValueHeaders 而不是headers。

        const response = {
            isBase64Encoded: true,
            statusCode: 200,
            multiValueHeaders : {"Set-Cookie": [`language=${language}`, `theme=${theme}`]},
            body: JSON.stringify('User profile set successfully')
        };
        callback(null, response);
    

    如果您需要它更聪明,请考虑类似

    function createHeaders(headers) {
      const defaultHeaders = {
        'Access-Control-Allow-Origin': '*',
      };
      const allHeaders = Object.assign({}, defaultHeaders, headers);
      const singleValueHeaders = {};
      const multiValueHeaders = {};
      Object.entries(allHeaders).forEach(([key, value]) => {
        const targetHeaders = Array.isArray(value) ? multiValueHeaders : singleValueHeaders;
        Object.assign(targetHeaders, { [key]: value });
      });
    
      return {
        headers: singleValueHeaders,
        multiValueHeaders,
      };
    }
    

    然后在回调函数中使用。

    callback(null, {
      statusCode: status || 200,
      body: JSON.stringify(body),
      ...createHeaders({ 'Set-Cookie': cookie }),
    });
    

    【讨论】:

    【解决方案2】:

    API 网关不允许您多次映射同一个标头。我通过使用不同的大小写来设置cookie方法。

    callback(null, {
        "statusCode": 302,
        "Location" : "https://somewebsite.com"
        "headers": { "Set-Cookie": cookie1, "set-Cookie": cookie2 },
        "body": "..."
    });
    

    【讨论】:

    • 这显然是对 AWS API 的破解。如果他们在没有通知的情况下更改它,我不会感到惊讶。
    • 这是一种巧妙的方法,可以将多个项目添加到 Javascript 对象,它们看起来与 Javascript 不同,但在浏览器中却相同。它与任何 AWS API 无关。
    • 为什么第二组 cookie 键有小 'set-Cookie' 字母?如果我想添加第三个 cookie 参数怎么办?
    • 我问自己,实现这种事情的最天真的方法是使用哈希图。这使得密钥应该是唯一的。浏览器不会在 set-cookie 上寻找大小写。因此,如果您想要第三个 cookie,只需使用不同的外壳即可。
    【解决方案3】:

    我会说您的问题与回调中的响应对象未按照 api 网关期望的方式格式化有关。

    这些链接专门引用了 aws 文档。

    http://docs.aws.amazon.com/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html

    您的代码有问题...

    • “位置”看起来不是有效属性
    • 确保您的标头键/值对是使用 JSON.stringify 之类的实际 JSON 对象

    不要忘记为 api gateway 和 lambda 启用完整请求和响应的日志。这两个日志将帮助您调试。

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2015-11-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2016-12-15
      相关资源
      最近更新 更多