node.js - Passport deserializeUser 从未调用过
问题描述
我正在将 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
会话中的条目为空,护照不会调用是正常的deserializeUser
。
您的评论似乎确认问题出在会话系统中。
一个最小的工作会话系统可以是:
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 在您的设置中不起作用。
推荐阅读
- python - Matplotlib 条件标记颜色
- cypher - CYPHER 获取节点之间的边
- angular - 带有 @Input 装饰器的 Angular 6 Karma 测试子类
- java - 使用带有依赖关系的单行命令行调用运行简单的一个文件 java 程序
- java - 放心 - 使用 GPath 从多个记录列表中提取单个值
- dart - Flutter:如何使用双列表对表的数据进行排序
- c# - c#对象参数在分配参数后神秘地清除
- python - 循环遍历数据框以根据 python 中的 2 个索引返回行
- php - Laravel 5.3 应用程序抛出错误而不是显示登录视图
- abap - 通过 ME_PROCESS_PO_CUST BAdi 更新 ME21n 字段 WEORA/BSTAE?