我没有看到在req.user
或req.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(/...));
你应该通过用户ID在连载完成回调
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)
}
});
然而,为了检查用户是否登录,我对服务器/帐号/我需要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()
方法和限制对象,我挑的属性。
希望这可以帮助别人。