Passport deserializeUser 从未调用过
Passport deserializeUser never called
我正在将 Passport 集成到我的 NodeJs APP 中并且注册有效,登录本身有效但是在登录后直接重定向时我的 Session.Passport 再次为空并且永远不会调用 deserializeUser。也许有人看到我在哪里犯了错误或者知道我做错了什么。
首先我的 Passport 设置在我的 app.js:
app.use(session({ cookie: { maxAge: 18000 },
secret: cryptoSecret,
resave: false,
saveUninitialized: true,
secure: false,
store: new memoryStore({checkPeriod: 86400000}),
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(passport.session());
我的本地攻略等:
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
console.log('Serialize User');
console.log(user);
console.log('---------------------------------------');
console.log(user._id);
console.log('---------------------------------------');
done(null, user._id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
console.log('deserialize Important!');
User.findById(id, function(err, user) {
console.log(err);
done(err, user);
});
});
passport.use('local-login', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ 'local.email' : email }, function(err, user) {
// if there are any errors, return the error before anything else
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
// all is well, return successful user
return done(null, user);
});
}));
};
这是我的登录路径:
router.post('/', cors(), passport.authenticate('local-login', { failureRedirect : '/', failureFlash : true}), (req, res) => {
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:' , req.session);
req.logIn(req.session.passport.user, err => {
if(err) {
console.log(err);
}
res.redirect('/group');
});
});
我在使用 successRedirect 而不是 res.redirect 时得到相同的行为:/
验证后直接会话:
重定向时我的会话:
我追踪到我的反序列化用户函数没有被调用,并且阅读了这么多 SO 条目和其他站点而没有任何变化。 atm有点沮丧。
首先感谢大家的阅读和帮助。我感谢所有可能对我有帮助的信息。希望大家度过愉快的一天:)
看来问题是会话不工作,因为在重定向后会话中的 passport
条目是空的,passport 不会调用 deserializeUser
.[=13= 是正常的]
您的评论似乎证实问题出在会话系统中。
一个最小的工作会话系统可以是:
const session = require("client-sessions");
const cookieParser = require("cookie-parser");
const express = require("express");
const app = express();
app.use(cookieParser());
app.use(session({ cookie: { ephemeral: true }, cookieName: "session", secret: "keyboardcat" }));
如果这都不能使您的会话系统正常工作,我建议您检查是否有什么东西使 cookie 在您的设置中不起作用。
当您使用 passport.authenticate()
作为路由中间件时,您不需要 req.logIn()
因为
此中间件会自动调用 req.login()
以建立登录会话。
请参阅护照文件中的 req.login()
。
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:' , req.session);
显示用户已经通过身份验证。
我认为问题是 req.logIn()
没有成功,它覆盖了会话,所以你会有所不同
_expries
时间 /login
和 /group
。也尝试增加 maxAge
,你将它设置为 18 秒
试试这个
router.post('/login', cors(), passport.authenticate('local-login', {
failureRedirect: '/', failureFlash: true
}), (req, res) => {
// If this function gets called, authentication was successful.
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:', req.session);
res.redirect('/group');
})
我正在将 Passport 集成到我的 NodeJs APP 中并且注册有效,登录本身有效但是在登录后直接重定向时我的 Session.Passport 再次为空并且永远不会调用 deserializeUser。也许有人看到我在哪里犯了错误或者知道我做错了什么。
首先我的 Passport 设置在我的 app.js:
app.use(session({ cookie: { maxAge: 18000 },
secret: cryptoSecret,
resave: false,
saveUninitialized: true,
secure: false,
store: new memoryStore({checkPeriod: 86400000}),
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(passport.session());
我的本地攻略等:
// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
console.log('Serialize User');
console.log(user);
console.log('---------------------------------------');
console.log(user._id);
console.log('---------------------------------------');
done(null, user._id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
console.log('deserialize Important!');
User.findById(id, function(err, user) {
console.log(err);
done(err, user);
});
});
passport.use('local-login', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ 'local.email' : email }, function(err, user) {
// if there are any errors, return the error before anything else
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
// all is well, return successful user
return done(null, user);
});
}));
};
这是我的登录路径:
router.post('/', cors(), passport.authenticate('local-login', { failureRedirect : '/', failureFlash : true}), (req, res) => {
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:' , req.session);
req.logIn(req.session.passport.user, err => {
if(err) {
console.log(err);
}
res.redirect('/group');
});
});
我在使用 successRedirect 而不是 res.redirect 时得到相同的行为:/
验证后直接会话:
重定向时我的会话:
我追踪到我的反序列化用户函数没有被调用,并且阅读了这么多 SO 条目和其他站点而没有任何变化。 atm有点沮丧。 首先感谢大家的阅读和帮助。我感谢所有可能对我有帮助的信息。希望大家度过愉快的一天:)
看来问题是会话不工作,因为在重定向后会话中的 passport
条目是空的,passport 不会调用 deserializeUser
.[=13= 是正常的]
您的评论似乎证实问题出在会话系统中。
一个最小的工作会话系统可以是:
const session = require("client-sessions");
const cookieParser = require("cookie-parser");
const express = require("express");
const app = express();
app.use(cookieParser());
app.use(session({ cookie: { ephemeral: true }, cookieName: "session", secret: "keyboardcat" }));
如果这都不能使您的会话系统正常工作,我建议您检查是否有什么东西使 cookie 在您的设置中不起作用。
当您使用 passport.authenticate()
作为路由中间件时,您不需要 req.logIn()
因为
此中间件会自动调用 req.login()
以建立登录会话。
请参阅护照文件中的 req.login()
。
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:' , req.session);
显示用户已经通过身份验证。
我认为问题是 req.logIn()
没有成功,它覆盖了会话,所以你会有所不同
_expries
时间 /login
和 /group
。也尝试增加 maxAge
,你将它设置为 18 秒
试试这个
router.post('/login', cors(), passport.authenticate('local-login', {
failureRedirect: '/', failureFlash: true
}), (req, res) => {
// If this function gets called, authentication was successful.
console.log('Login route! Authenticated?:', req.isAuthenticated(), ' Session:', req.session);
res.redirect('/group');
})