在AWS lambda Node JS的http响应头中设置Cookie

时间:2017-07-14 20:28:57

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

我启用了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”中调用目标时,请求在标头中没有cookie。

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

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

3 个答案:

答案 0 :(得分:4)

API网关不允许您多次映射相同的标头。我使用不同的套管来设置cookie方法。

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

答案 1 :(得分: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 :(得分:0)

我想说你的问题与回调中的响应对象没有像api网关所期望的那样格式化的事实有关。

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

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

您的代码问题......

  • '位置'看起来不像是有效的财产
  • 确保您的标题键/值对是使用JSON.stringify
  • 之类的实际JSON对象

不要忘记为api网关和lambda启用日志,并提供完整的请求和响应。这两个日志将帮助您进行调试。