销毁 cookie NodeJs

Destroy cookie NodeJs

我正在使用 Cookies 模块来设置 cookie。以下是我的代码:

var options = {
    maxAge: ALMOST_ONE_HOUR_MS,
    domain: '.test.com',
    expires: new Date(Date.now() + ALMOST_ONE_HOUR_MS)
};
var value = userInfo.token;
cookies.set("testtoken", value, options);

但是在文档中我还没有找到如何销毁这个cookie。

如有任何建议,我们将不胜感激。

根据 HTTP 规范,无法删除 cookie。要有效 "delete" 一个 cookie,您可以将过期日期设置为过去的某个日期。本质上,这将为您带来以下结果(根据 cookies 模块文档):

cookies.set('testtoken', {maxAge: 0});

或者根据 HTTP 规范:

cookies.set('testtoken', {expires: Date.now()});

两者都应该有效。您可以将 Date.now() 替换为 new Date(0) 以获得真正的旧日期。

对于 webapp,您只需将 cookie 设置为响应即可:

res.cookie("key", value);

并删除 cookie: 参考:https://expressjs.com/en/api.html#res.clearCookie

res.clearCookie("key");

别忘了:

res.end()

避免网络请求挂起。

我将其与 cookie-parser 模块一起使用:

router.get('/logout', function(req, res){
    cookie = req.cookies;
    for (var prop in cookie) {
        if (!cookie.hasOwnProperty(prop)) {
            continue;
        }    
        res.cookie(prop, '', {expires: new Date(0)});
    }
    res.redirect('/');
});

要删除任何 http cookie,如果我们只是试图从响应中清除它 [使用 res.clearCookie("key")],那肯定不会起作用。实际上,要删除http cookie,域和路径非常重要。

域名和路径定义了cookie的范围。从表面上看,它们实质上是告诉浏览器该 cookie 属于哪个网站。 发送相同的 cookie 值; expires appended 也是一个坏主意,因为你希望内容被销毁,但这不会发生。

最好的办法是通过将值设置为空来使 cookie 无效,并包括一个过期字段,如下所示:

res.cookie("key","empty the key content", {expires:old date, domain:'.example.com', path:'/'});

res.cookie("token", "", { expires: new Date(0),domain:'.test.com', path: '/' });

希望对您有所帮助!!!

虽然另一个答案是正确的,但从 express.js 网络应用程序中删除 cookie 是通过调用以下方法完成的:

res.clearCookie("key");

但有一个警告!

您的 cookie 选项(过期除外)需要与您设置时相同。否则浏览器将不会删除 cookie。所以使用相同的域、安全设置等(参考:https://expressjs.com/en/4x/api.html#res.clearCookie

我也在使用 cookie-parser,上面的答案让我找到了解决方案。就我而言,我还需要添加 overwrite: true,否则会添加新的 cookie 密钥。

所以我的最终解决方案如下:

res.cookie('cookieName', '', {
      domain: 'https://my.domain.com',
      maxAge: 0,
      overwrite: true,
    });

几天前我遇到了同样的问题。和朋友讨论后,我认为这是最好的解决方案。

res.setHeader('set-cookie', 'mycookie=; max-age=0');

优点:

  • 只使用节点
  • 简单易懂

学分:@andy

在生产中使用 SSL 时,您需要指定域。这个域必须和那个域一一对应,就是用来存放cookie的!

例如:

res.clearCookie('sid', {domain: ".somedomain"})

最好的方法

在你设置喜欢的标记之前,你应该先删除它 像那样

res.clearCookie('token');
res.cookie('token',token, { maxAge: 900000, httpOnly: true });

我已经尝试了所有的解决方案,并且 none 找到了这个解决方案。

  1. 我这样设置我的 cookie:
res.writeHead(200, {
   "Set-Cookie": `token=${accessToken}; HttpOnly; path=/`,
   "Access-Control-Allow-Credentials": "true",
});

res.end();
  1. 然后这样销毁:
res.writeHead(200, {
    "Set-Cookie": `token=; HttpOnly; path=/; max-age=0`,
});
res.end();

另一种从服务器销毁 cookie 的方法。只需将负整数设置为 maxAge。还有一点要记住,不要忘记在设置或销毁 cookie 时设置路径。