passport.js deserializeUser不修改req.user

问题描述 投票:0回答:2

我没有看到在req.userreq.session.passport.user对象作为deserializeUser()的结果没有任何影响。

我的理解是,deserializeUser()的成功完成应该导致我的用户对象,我从数据库中检索应设置为req.user财产。这个对吗?

此外,似乎这个回调的目的是为了让我序列化小物件(例如:{username: 'me', email: '[email protected]'})在cookie本身,而是再加入从数据库中检索到下游使用更多的用户信息。

相反,我看到以下内容:

passport.serializeUser(function(user, done) {
    // user: '[email protected]'
    fetchUser(user, function(u) {
        // u: { email: '[email protected]', name: 'Stan Stadelman' }
        done(null, u);
    });
});

passport.deserializeUser(function(id, done) {
    // id: { email: '[email protected]', name: 'Stan Stadelman' }
    fetchUser(id.email, function(user) {
        // user: { email: '[email protected]', name: 'Stan Stadelman',    local_props: 'from_db'}
        done(null, user);
    });
});

req.user = '[email protected]'
req.session = { cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: { user: { email: '[email protected]', name: 'Stan Stadelman'    } } }

我的期望是,req.session.passport.user和/或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(/...));
express passport.js
2个回答
1
投票

你应该通过用户ID在连载完成回调

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

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

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

0
投票

我碰到了类似的问题,而是由别的东西造成的。 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)
  }
});

然而,为了检查用户是否登录,我对服务器/帐号/我需要req.user并将其作为JSON的路线:

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

要过滤敏感性质,我的方法的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()方法和限制对象,我挑的属性。

希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.