无法删除快递中的cookie

时间:2016-07-25 00:19:09

标签: javascript node.js express cookies

非常简单。我在/user/login路线中设置了一个像这样的cookie:

if (rememberMe) {
    console.log('Login will remembered.');
    res.cookie('user', userObj, { signed: true, httpOnly: true, path: '/' });
}
else {
    console.log('Login will NOT be remembered.');
}

我已经为cookie-parser设置了秘密:

app.use(cookieParser('shhh!'));

非常基本的东西。只要我能够检索存储在cookie中的任何内容,一切都很有效:

app.use(function (req, res, next) {
    if (req.signedCookies.user) {
        console.log('Cookie exists!');
        req.session.user = req.signedCookies.user;
    }
    else {
        console.log('No cookie found.');
    }

    next();
});

这个中间件在其他任何东西之前调用,所以为了参数" Cookie存在!"如果cookie有效,则始终在我的控制台中记录。

问题是当我尝试删除cookie时。我已尝试res.clearCookie('user')res.cookie('user', '', { expires: new Date() }),我尝试传入相同的标记(我传递给res.cookie()中的/user/login)。我试图使用这些方法的组合,但没有任何效果。

目前,我能够清除cookie(而不是接收" Cookie存在!"日志消息)的唯一方法是清除浏览器历史记录。这是我的注销路线:

route.get('/user/logout', function (req, res, next) {
    res.clearCookie('user');
    req.session.destroy();
    util.response.ok(res, 'Successfully logged out.');
});

似乎我甚至无法修改cookie值;我把

res.cookie('user', {}, { signed: true, httpOnly: true, path: '/' })

在我的注销路线中,但cookie值保持不变。

5 个答案:

答案 0 :(得分:4)

经过漫长而烦恼的时间后,我意识到我的前端没有将cookie发送到终点,我正试图清除cookie ......

在服务器上:

function logout(req, res) {
  res.clearCookie('mlcl');
  return res.sendStatus(200);
}

在前端,

fetch('/logout', { method: 'POST', credentials: 'same-origin' })

添加"凭据:'同源'"是什么让clearCookie为我工作。如果没有发送cookie,则无需清除。

我希望这会有所帮助。我希望我早些发现这个......

答案 1 :(得分:1)

确保您要发送要清除的凭据

即使它只是一个/logout端点,您仍然需要发送凭据。

// FRONT END
let logOut = () => {

  fetch('logout', {
    method: 'get',
    credentials: 'include', // <--- YOU NEED THIS LINE
    redirect: "follow"
  }).then(res => {
    console.log(res);
  }).catch(err => {
    console.log(err);
  });

}


// BACK END
app.get('/logout', (req, res) => {
  res.clearCookie('token');
  return res.status(200).redirect('/login');
});

答案 2 :(得分:0)

通过(广泛的)搜索和随意的想法来判断,答案是使用

res.clearCookie('<token_name>',{path:'/',domain:'<your domain name which is set in the cookie>'});

即。

    res.clearCookie('_random_cookie_name',{path:'/',domain:'.awesomedomain.co'}); 

请注意Cookie中指定的,因为我们将其用于子域(您可以将其用于没有点的子域,但使用它更安全)。

TLDR;您还必须提供域:

答案 3 :(得分:0)

即使它不能帮助这个问题的作者,我希望这可以对某人有所帮助。 我遇到了无法在使用Express api的React应用程序中删除Cookie的问题。我使用了axios,几个小时后,我终于能够修复它。

await axios.post('http://localhost:4000/api/logout', { } , { withCredentials: true })

{ withCredentials: true }是它对我有用的原因。

这是我的Express代码:

 const logOutUser = (req, res) => {
  res.clearCookie('username')
  res.clearCookie('logedIn')
  res.status(200).json('User Logged out')
}

答案 4 :(得分:0)

路径必须正确。就我而言,这是拼写错误