AWS Lambda Set-Cookie 标头未在浏览器中设置

Bra*_*050 5 httpcookie setcookie aws-lambda aws-api-gateway

我正在尝试在我的 aws lambda 函数响应中设置 cookie。我没有任何标头映射,因为我正在使用 lambda 代理与 API Gateway 集成。lambda 函数中的响应代码如下所示:

exports.handler = async (event) => {     
const response = {
    statusCode: 200,
    "multiValueHeaders": {
    "Set-Cookie": ["gtgm=6c7729687d5ff1a05f1a5dfb15ce3b8fa3f2b590; path=/; expires=Fri, 13-Feb-2032 13:27:44 GMT; secure; HttpOnly; SameSite=None"]
  },
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers": "*",
      "Access-Control-Allow-Credentials": true,
    },
  };
  return response;
};
Run Code Online (Sandbox Code Playgroud)

我使用 fiddler 检查响应,我可以在响应中看到“Set-Cookie...”,这让我相信上面的代码是正确的?问题是浏览器只是忽略它并且除了 AWS DNT cookie 之外根本不设置任何 cookie。我不确定还需要检查什么,或者我是否遗漏了 cookie 配置中的任何内容。

这就是我的请求:

<Button
      onClick={() => {
        fetch(
          "https:mysupercoolapi.com/cookie-test/",
          {
            // credentials: "include",
            headers: {
              "Content-Type": "application/json",
              // "Access-Control-Allow-Credentials": "true",
            },
          }
        )
          .then((response) => response.json())
          .then((data) => {
            console.log(data);
          });
      }}
    >
      Cookie Test
    </Button>
Run Code Online (Sandbox Code Playgroud)

不确定我错过了什么或者哪里出了问题。

Bra*_*050 3

我想自己解决这个问题。上面的设置很好,但浏览器要求您正确设置以下内容才能实际设置 cookie:

  • 在请求中:将“凭据”设置为包含。取决于您使用的库(获取将是凭据:“include”)。您可以看到它在我上面的原始帖子中被注释掉,这是不正确的。
  • 在 Lambda 函数的响应标头中,您需要设置源,例如“Access-Control-Allow-Origin”:“http://localhost:3002”。测试后我将其切换到我的实际域。如果有一种方法可以将此设置保留为实际域,但在本地主机上测试时仍然可以工作,请告诉我。
  • 在 API Gateway 中,您需要设置 CORS 值(如下面的屏幕截图所示),以确保预检 (OPTINOS) 调用也正确进行。在此输入图像描述

关键是正确配置请求和响应标头。当使用像 AWS 这样的东西时,这很难做到,但当使用像express.js这样可以使用中间件的东西时,这就容易得多。