【问题标题】:how to send cookie and redirect at same time in response ? (serverless framework)如何在响应中同时发送 cookie 和重定向? (无服务器框架)
【发布时间】:2017-11-25 21:09:29
【问题描述】:

下面是我用来在单个响应中设置 cookie 和重定向链接的代码,但只有其中一个可以工作。如果 statusCode 为 301/302,则重定向正在发生,但未设置 cookie。如果 statusCode 为 200 cookie 已设置但重定向不起作用。有谁知道如何在一个请求中同时使用两者?我应该更改 StatusCode 一些状态代码不允许设置 cookie 吗?

const response = {
    statusCode: 302,
        headers: {
          "Access-Control-Allow-Origin" : "*",
          "Access-Control-Allow-Credentials" : true,
          "Set-Cookie": 'data='+data,
          "Location":"http://localhost:8040/#/dashboard",
        },
        body: JSON.stringify({
          message: data,
        }),
      };
      callback(null, response);

我正在使用nodejs的无服务器框架。

这是回复的截图

但在 cookie 中注明的是 der

【问题讨论】:

  • 显然可以这样做:Sending browser cookies during a 302 redirect。所以,也许问题更多是关于如何在你的框架中做到这一点?我建议您确切告诉我们您使用的是什么框架。
  • 我正在使用无服务器框架...serverless framework,我可以单独实现它们,但总体上它不会发生
  • 当您重定向时,您是否更改了以前的域、端口或协议?或者,你只是改变路径?
  • "localhost:8040/#/dashboard" -- 这就是我提到的,它指向不同的域。就像在新标签中打开一个网址一样
  • 我怀疑这是你的问题。不允许服务器在任何随机域中设置 cookie。

标签: javascript node.js cookies serverless-framework


【解决方案1】:

浏览器不会接受与请求发送到的完全不同的域的 cookie。因此,如果您要重定向到新域,则无法为该新域设置 cookie。

cookie 的domain 部分仅适用于具有相同根域但仅子域不同的域。

这取自RFC 6265:

除非域属性,否则用户代理将拒绝 cookie 指定包含源服务器的 cookie 的范围。 例如,用户代理将接受带有域的 cookie “example.com”或“foo.example.com”的属性来自 foo.example.com,但用户代理不会接受带有 “bar.example.com”或“baz.foo.example.com”的域属性。

所以,回顾一下。您不能从您的服务器为完全不同的域设置 cookie,并且 cookie 中的 domain 属性也不会拯救您。在特殊情况下,您可以为不同的域设置一个cookie,该cookie仅在子域中有所不同(例如共享相同的根域)。


仅供参考,如果您的 cookie 都设置得当,您必须更改此设置:

"Set-Cookie": 'data='+data,

到这里:

"Set-Cookie": 'data=' + JSON.stringify(data),

正确序列化您的对象。

【讨论】:

  • 我完全理解你的意思。然而,在删除域部分后它也不起作用,我编辑了问题
  • @user3649118 - 那么,您现在明白不能为完全不同的域设置 cookie 了吗?您可以这样做的唯一特殊情况是,如果原始域和新域共享一个共同的根域(例如,仅在子域中不同)并且您在 cookie 中使用 domain 属性。但是,如果两个域不共享一个根域,则不能以任何方式为另一个域设置 cookie。这被认为是一个巨大的安全漏洞,因此浏览器不允许这样做。
  • 如果我不使用域属性怎么办,那么它必须默认设置为同一个域并保持默认时间。但我力求得到 res 域的任何 cookie。可能是什么问题
  • @user3649118 - 如果您从 cookie 中删除 domain 属性,则 cookie 应设置在请求的原始域上,而不是您要重定向到的域上。
  • 是的,但是在重定向发生后我没有看到任何原始域设置的cookie
【解决方案2】:

您将 cookie 设置为等于 data=[Object object] 而不是实际信息。

您需要在该字符串中序列化您的数据对象。

【讨论】:

  • 我什至添加了文本而不是对象,但它只是重定向并且没有设置 cookie
猜你喜欢
  • 2017-10-05
  • 2020-09-10
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多