passport.js deserializeUser 未修改 req.user
passport.js deserializeUser not modifying req.user
我没有看到 req.user
或 req.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()
方法并将对象限制为我选择的属性。
希望这对某人有所帮助。
我没有看到 req.user
或 req.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()
方法并将对象限制为我选择的属性。
希望这对某人有所帮助。