passport.js deserializeUser 未修改 req.user

passport.js deserializeUser not modifying req.user

我没有看到 req.userreq.session.passport.user 对象因 deserializeUser() 而受到任何影响。

我的理解是 deserializeUser() 的成功完成应该导致我的用户对象 从数据库检索应该设置为 req.user 属性。 这是正确的吗?

此外,这个回调的目的似乎是允许我在cookie本身中序列化一个小对象(例如:{username: 'me', email: 'me@me.com'}),然后添加从数据库中检索到的更多用户信息以供使用下游。

相反,我看到了以下内容:

passport.serializeUser(function(user, done) {
    // user: 'stan@stadelman.com'
    fetchUser(user, function(u) {
        // u: { email: 'stan@stadelman.com', name: 'Stan Stadelman' }
        done(null, u);
    });
});

passport.deserializeUser(function(id, done) {
    // id: { email: 'stan@stadelman.com', name: 'Stan Stadelman' }
    fetchUser(id.email, function(user) {
        // user: { email: 'stan@stadelman.com', name: 'Stan Stadelman',    local_props: 'from_db'}
        done(null, user);
    });
});

req.user = 'stan@stadelman.com'
req.session = { cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: { user: { email: 'stan@stadelman.com', name: 'Stan Stadelman'    } } }

我的期望是 req.session.passport.user and/or req.user 对象应该包含 local_props 属性 值。我是在错误地阅读文档和教程,还是有问题?我已经在 passport.js github here.

中交叉发布

我的快递和护照设置如下:

// express configs
app.use(cookieParser(expressSecret));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(expressSession({ 
    secret: expressSecret, 
    resave: true, 
    saveUninitialized: true }
));
app.use(passport.initialize());
app.use(passport.session());

// passport implementation
passport.use(new BasicStrategy(/...));

您应该将用户 ID 传递给序列化中的 done 回调

passport.serializeUser(function(user, done) {
    done(null, user.id);
}); 

然后在反序列化中使用该 ID 获取用户

passport.deserializeUser(function(id, done) { 
    fetchUser(id, function(user) {
        done(null, user); 
    }); 
});

我 运行 遇到了类似的问题,但是由其他原因引起的。 Passport.js deserializeUser() 将用户对象设置为 req.user:

passport.deserializeUser(async function(id, done) {
  try {
    const account = await Account.findById(id);
    done(null, account);
  } catch (error) {
    done(error, null)
  }
});

但是,为了检查用户是否登录,我在服务器 /account/me 上有一个路由 req.user 和 returns 作为 json :

router.route('/account/me').get(mwAuthentication, (req, res) => {
  res.json(req.user);
});

为了过滤敏感属性,我在 Mongoose 模式中定义了一个 toJSON() 方法:

AccountSchema.methods.toJSON = function() {
  let account = this;
  let accountObject = account.toObject();
  return _.pick(accountObject, ['_id', 'fullName', 'email', 'facebookId', 'photoUrl']);
};

当您调用 res.json(req.user) 时,它会在内部调用 JSON.stringify(req.user),这会再次调用我的 toJSON() 方法并将对象限制为我选择的属性。

希望这对某人有所帮助。