NodeJS 无法删除Express中的cookie

scyqe7ek  于 2022-11-29  发布在  Node.js
关注(0)|答案(8)|浏览(166)

非常简单。我在/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解析器设置了密码:

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() }),我也尝试过传递相同的标志(我在/user/login中传递给res.cookie())。我尝试过使用这些方法的组合,但没有任何效果。
目前,我能够清除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值保持不变。

6ss1mwsb

6ss1mwsb1#

我意识到,经过很长一段时间和恼人的时间,我的前端是不是发送cookie到终点是我试图清除cookie...
在服务器上:

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

在前端,

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

添加“凭证:'same-origin'“是clearCookie为我工作的原因。如果cookie没有被发送,它就没有什么要清除的。
希望这能帮上忙真希望我早点找到这个...

ki1q1bka

ki1q1bka2#

虽然这对这个问题的作者没有帮助,但我希望这能帮助一些人。我遇到了同样的问题,我无法删除我的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')
}
tvmytwxo

tvmytwxo3#

通过(广泛的)搜索和突然出现在我脑海中的一个随机想法来判断,答案是使用

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;您必须在后端提供 route和domain:,以便在前端向同一端点发出请求。

iibxawm4

iibxawm44#

请确保发送要清除的凭据

即使它只是一个/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');
});
iqxoj9l9

iqxoj9l95#

做了一个噩梦,让这个工作,以及这对我的工作,希望有助于某人。
快速路由器

router.post('/logout', (req, res) => {
    res.clearCookie('github-token', {
        domain: 'www.example.com',
        path: '/'
    });
    return res.status(200).json({
        status: 'success',
        message: 'Logged out...'
    });
});

React前端处理注销。

const handleLogout = async () => {
    const logout = await fetch('/logout', {
        method: 'POST',
        credentials: 'include',
    });
    if (logout.status === 200) {
        localStorage.clear();
        alert('Logged out');
    } else {
        alert('Error logging out');
    }
};

我在auth调用中设置cookie,如下所示。

res.cookie('github-token', token, {
    httpOnly: true,
    domain: 'www.example.com',
    secure: true
});

重要的是,您需要在clearCookie方法中添加路径和域。

bksxznpy

bksxznpy6#

路径必须正确。在我的例子中,这是路径中的一个错字

h43kikqp

h43kikqp7#

2022年11月(Chrome浏览器)-我的工作方式

前端:

const logOut = async () =>{
  await axios.post(LOGOUT_URL, {}, {withCredentials: true}) // <-- POST METHOD, WITH CREDENTIALS IN BODY
}

后端:

res.clearCookie('jwt') // <- NO EXTRA OPTIONS NEEDED, EVEN THOUGH HTTPONLY WAS SET
return res.sendStatus(204)
1cosmwyk

1cosmwyk8#

我是新来的,但添加一个返回(return res.sendStatus(204);)到后端功能是什么删除了cookie对我来说,希望它有帮助。没有返回它不删除cookie,但只日志“会话结束”

app.post("/logout", (req, res) => {
  if (req.session.user && req.cookies.user_sid) {
    res.clearCookie("user_sid");
    console.log("session over");
    return res.sendStatus(204);
  } else {
    console.log("error");
  }
});

相关问题