使用 passport.js 反序列化用户错误时如何清除 cookie?

How to clear cookies when error deserialize a user using passport.js?

当我使用 passport.deserializeUser 处理程序时:

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

如果使用 err 调用 done,我是否有机会清除 cookie 并将用户重定向到 /login 页面?该功能是否取决于我使用的策略?例如。使用本地策略的 failureRedirect 选项?

你可以做的是使用 req.session.destroy 方法....所以在你的情况下:

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
    req.session.destroy();
  });
});

而且技术上可能不会 "Fully" 在您的应用程序中注销此人,因此如果您想要替代方法,可以使用提供的 clearCookie 方法:

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
      req.session.destroy(function() {
      res.clearCookie('connect.sid');
      res.redirect('/');
    });
  });
});

我用过continuation local storage,在passport前注册过

var createNamespace = require('continuation-local-storage').createNamespace;
var writer = createNamespace('express');

app.use((req,res,next) => {
    namespace.bindEmitter(req);
    namespace.bindEmitter(res);
    namespace.run(() => {
        writer.set('req', req)
        writer.set('res', res);
        next()
    });
});

app.use(passport.initialize(), passport.session());

然后在你的反序列化中你可以访问相同的命名空间并提取值:

var getNamespace = require('continuation-local-storage').getNamespace;
var reader = getNamespace('express');

function deserialize(key, done) {
   try {
      ...
   } catch(e) {
      reader.get("req").logout()
   }
}

就像@amanuel2 指出的那样,您可以使用 req 来销毁会话。如果您要求,护照会将 req 传递给 deserializeUser

passport.deserializeUser(function(req, id, done) {
    User.findById(id, function(err, user) {
        if (err) {
            req.session.destroy(function() {
               return done(err)
            }
        }
        done(null, user);
    });
});

因此,如果反序列化会话出现问题,您可以销毁会话、重定向等。