PassportJS 节点:为什么即使不使用会话也需要 serializeUser 和 deserializeUser?
PassportJS Node: why need serializeUser and deserializeUser even when not using session?
exports.initPassportLocalStrategy = function () {
passport.use(new LocalStrategy(
{
session: false
},
function(username, password, done) {
UserProxy.validateUserWithPassword(username, password)
.then(function (user) {
if(user) done(null, user);
else done(null, false);
})
.catch(done);
}
));
passport.serializeUser(function(user, cb) {
cb(null, user);
});
};
我正在实施一个没有 seesion 的基于令牌的身份验证中间件。所以我想知道为什么我需要提供一个 serialzeUser
功能?我读到原因是将用户或其某些属性放入会话中,然后 desearlizeUser
将从会话中检索整个对象并将其放入 req.user
中。
所以这是我的问题:
为什么不能完成(null, user);在 LocalStrategy
函数中将用户放入 req.user
?为什么还要麻烦序列化和反序列化?
如果删除 searlizeUser
函数我会得到一个错误,但我可以在没有 deserilzeUser
函数的情况下逃脱,为什么?而在这种情况下,谁把用户对象放到req.user
?
非常感谢。
您不需要 serialize/deserialize。你的设置有点错误。
您需要将 session: false
移出策略并移至 passport.authenticate
。这是因为策略无法决定这一点,它取决于您的路由您想要哪种身份验证。
passport.use(new LocalStrategy(
function(username, password, done) {
UserProxy.validateUserWithPassword(username, password)
.then(function (user) {
if(user) done(null, user);
else done(null, false);
})
.catch(done);
}
));
app.use(passport.initialize());
app.post('/auth', passport.authenticate(
'local', {
session: false // here goes the session false
}), doWhateverYourSetupNeeds);
exports.initPassportLocalStrategy = function () {
passport.use(new LocalStrategy(
{
session: false
},
function(username, password, done) {
UserProxy.validateUserWithPassword(username, password)
.then(function (user) {
if(user) done(null, user);
else done(null, false);
})
.catch(done);
}
));
passport.serializeUser(function(user, cb) {
cb(null, user);
});
};
我正在实施一个没有 seesion 的基于令牌的身份验证中间件。所以我想知道为什么我需要提供一个 serialzeUser
功能?我读到原因是将用户或其某些属性放入会话中,然后 desearlizeUser
将从会话中检索整个对象并将其放入 req.user
中。
所以这是我的问题:
为什么不能完成(null, user);在
LocalStrategy
函数中将用户放入req.user
?为什么还要麻烦序列化和反序列化?如果删除
searlizeUser
函数我会得到一个错误,但我可以在没有deserilzeUser
函数的情况下逃脱,为什么?而在这种情况下,谁把用户对象放到req.user
?
非常感谢。
您不需要 serialize/deserialize。你的设置有点错误。
您需要将 session: false
移出策略并移至 passport.authenticate
。这是因为策略无法决定这一点,它取决于您的路由您想要哪种身份验证。
passport.use(new LocalStrategy(
function(username, password, done) {
UserProxy.validateUserWithPassword(username, password)
.then(function (user) {
if(user) done(null, user);
else done(null, false);
})
.catch(done);
}
));
app.use(passport.initialize());
app.post('/auth', passport.authenticate(
'local', {
session: false // here goes the session false
}), doWhateverYourSetupNeeds);