由于req.user
,我未发现对req.session.passport.user
或deserializeUser()
个对象产生任何影响。
我的理解是成功完成deserializeUser()
应该导致我的用户对象 I 从数据库中检索应该设置为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
和/或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(/...));
答案 0 :(得分:1)
您应该将用户ID传递给序列化中的完成回调
passport.serializeUser(function(user, done) {
done(null, user.id);
});
然后使用该ID在反序列化中获取用户
passport.deserializeUser(function(id, done) {
fetchUser(id, function(user) {
done(null, user);
});
});
答案 1 :(得分:0)
我遇到了类似的问题,但是是由其他原因引起的。 Passport.js computed: {
series() {
return this.test;
}
}
的工作是将用户对象设置为deserializeUser()
:
req.user
但是,为了检查用户是否登录,我在服务器/ account / me上有一条路由,该路由采用passport.deserializeUser(async function(id, done) {
try {
const account = await Account.findById(id);
done(null, account);
} catch (error) {
done(error, null)
}
});
并将其返回为json:
req.user
要过滤敏感属性,我有一个在Mongoose模式中定义的toJSON()方法:
router.route('/account/me').get(mwAuthentication, (req, res) => {
res.json(req.user);
});
当您调用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)
方法并将对象限制为我选择的属性。
希望这对某人有帮助。