代码之家  ›  专栏  ›  技术社区  ›  KAT

req.session.destroy和passport注销不会破坏客户端的cookie

  •  0
  • KAT  · 技术社区  · 6 年前

    我正试图在客户端销毁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 回复  |  直到 6 年前
        1
  •  1
  •   vesse    6 年前

    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 (用户名)。打电话后 要求注销 会话存储区仍保留会话,但缺少序列化用户信息,即,我不再登录:

    > 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")
    }
    

    同时 connect.sid 浏览器中的cookie现在保存新的会话密钥。

    现在添加 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

    现在,如果没有对服务器执行进一步的请求(新的请求可能会启动新的会话,即使没有登录),您不应该看到 连接.sid 浏览开发者工具中的cookie。