req.session.destroy и выход из паспорта не уничтожают куки на стороне клиента - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь уничтожить куки на стороне клиента, но не могу понять, как это сделать.Я попробовал несколько способов, которые предоставил паспорт и некоторые ответы на SO, но я не знаю, как очистить настоящий cookie.

На данный момент мой код:

app.get('/logout', function (req, res){
    sessionStore.destroy(req.sessionID, (err) =>{
        if(err)console.log(err);
        req.logout();
        req.session.destroy(function (err) {
            if(err) console.log(err);
            res.status(200).json({message : 'User Logged Out'});
        });

    });

});

Я также попробовал метод req.logOut();.

1 Ответ

0 голосов
/ 22 мая 2018

req.logout не очищает сеанс, но вместо этого очищает информацию для входа в систему из сеанса.Пример из моего хранилища сеансов после входа в систему:

> db.sessions.find().pretty();
{
  "_id" : "LkuoFL_cwkvNO3foD_k0zQYADevcdwW6",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"test\"}}",
  "expires" : ISODate("2018-06-05T17:31:54.631Z")
}

Здесь вы можете видеть, что passport.user в session JSON содержит значение, которое я возвратил из serializeUser (имя пользователя).После вызова req.logout хранилище сеанса все еще удерживает сеанс, но сериализованная информация пользователя отсутствует, т.е.Я больше не захожу в систему:

> db.sessions.find().pretty();
{
  "_id" : "LkuoFL_cwkvNO3foD_k0zQYADevcdwW6",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}",
  "expires" : ISODate("2018-06-05T17:32:02.391Z")
}

Если я изменю свой обработчик маршрута выхода из системы на этот:

app.post('/logout', (req, res) => {
  req.logout();
  req.session.destroy((err) => res.redirect('/'));
});

, я вижу, что после выхода из системы сеанс выше исчез, но новыйодин был создан, потому что я попал на первую страницу, и он начинает новый сеанс:

> db.sessions.find().pretty();
{
  "_id" : "KIX2rypzvpRdqW7VlzO8B8W-FMXwffGT",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}",
  "expires" : ISODate("2018-06-05T17:38:01.136Z")
}

Кроме того, cookie connect.sid в браузере теперь содержит новый ключ сеанса.

Теперь добавьтеclearCookie.С таким обработчиком выхода:

app.post('/logout', (req, res) => {
  req.logout();
  req.session.destroy((err) => {
    res.clearCookie('connect.sid');
    // Don't redirect, just print text
    res.send('Logged out');
  });
});

хранилище сеансов пусто после нажатия кнопки выхода из системы (обратите внимание, что в этом примере дальнейшие запросы не выполняются):

> db.sessions.find().pretty();
> 

изаголовки ответа на запрос на выход из системы показывают очищенный файл cookie:

Set-Cookie: connect.sid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT

Теперь, если к серверу не выполняются никакие дополнительные запросы (новые могут начать новый сеанс, даже если он не зарегистрирован).в) вы не должны больше видеть connect.sid cookie в инструментах просмотра.

...