【问题标题】:How to delete express session cookie如何删除快速会话 cookie
【发布时间】:2014-04-16 11:26:37
【问题描述】:

我正在使用 express session 和 mongo connect 进行用户身份验证,Angular 客户端通过 CORS 请求使用它。

app.use(express.cookieParser());
app.use(express.session({
    secret: 'xxxxxx',
    store: new MongoStore({
        db: 'dbname',
        clear_interval: 3600,
        host: 'localhost',
        port: 27017
    })
}));

登录工作正常,cookie 被删除,会话一切正常。

我的问题是结束会话。我有一个注销路线,基本上是这样做的:

req.session.destroy(function() {
    // log out code
});

但是在 mongo db.sessions 中,会话仍然存在,并且 sid cookie 仍然保留在用户代理上,因此如果用户在注销后重新访问任何“受保护”的 URL,会话将重新生成。

所以看起来我需要删除 cookie 或从数据库中删除会话,后者似乎是错误的,所以我试图删除 cookie,但没有运气,在 Express 中尝试了这个:

req.session.destroy(function() {
    res.clearCookie('connect.sid', { path: '/' });
});

看来我无法使用javascript删除客户端上的sid cookie,因为它只是http(??)这不起作用:

document.cookie = 'connect.sid=; path=/; domain=localhost; expires=Thu, 01 Jan 1970 00:00:01 GMT;';

任何想法如何摆脱这个烦人的会话cookie??!

【问题讨论】:

    标签: mongodb session cookies express


    【解决方案1】:

    req.session.destroy() 应该清除数据库中的会话。

    Express 在尝试销毁会话时可能使用了不同的 sessionID。确保 Session.prototype.destroy 实际上提取了与 mongodb.sessions 中的 id 匹配的正确 this.id

    我刚刚遇到这个问题,这是因为我向服务器发出的注销用户的请求不包含会话 cookie(遗漏了withCredentials)。

    $.ajax({
        url: 'http://url/auth/logout',
        type: 'GET',
        xhrFields: {
          withCredentials: true
        }
    });
    

    这导致 express 为请求生成一个新的会话 id,并要求 mongodb 删除具有该新 id 的会话(保持旧的保持不变)。

    【讨论】: