获取 "Can't serialize user" 错误,但从未调用 passport.serializeUser
Getting error of "Can't serialize user", but the passport.serializeUser is never called
我还在努力将护照添加到我的申请中!我明白了,这样我就不会再看到以前看到的疯狂的巨大错误,但应用程序一直在输出 {}
。因此,在尽可能多地输入 console.log()
语句后,我将范围缩小到应用程序说它无法序列化用户对象这一事实,但据我所知 passport.serializeUser()
函数永远不会被调用。
GitHub link with all files (other than node modules)
当然,我不是 100% 了解 passport 的工作原理,而且我是 Node 的超级新手,但有多年使用其他语言的经验,所以如果我需要,我可以手工完成,但我'我更喜欢使用护照,因为它允许我最终使用 Facebook 和 Google 身份验证而无需重新制作轮子,可以这么说。
错误
这是确切的错误:
Passport Strategy jhechtf (password)
user found
passwords are good
Passport Authenticate : jhechtf
Passport Authenticate Err: null
Passport Authenticate Info: { message: 'Logged In Successfully' }
AuthController Error: [Error: Failed to serialize user into session]
现在我用 google 搜索了 "Failed to serialize user into session passport.js" 几乎所有可以想象到的术语,但每次它似乎总是带有 deserializeUser
而不是 serializeUser
。让我印象深刻的一件事是,我从 serializeUser()
发出的 console.log()
呼叫在任何时间点都没有被看到。
AuthController.js
var passport = require('passport');
module.exports = {
_config: {
actions: false,
shortcuts: false,
rest: false
},
login: function (req, res) {
passport.authenticate('local', function (err, user, info) {
if(user==false){
return res.status(403).send(info);
}
console.log("Passport Authenticate : ", user.username);
console.log("Passport Authenticate Err: ", err);
console.log("Passport Authenticate Info: ", info);
req.logIn(user, function (err) {
if (err) {
console.log("AuthController Error: " , err);
return res.status(401).send(err);
}
//Assume a correct login?
var red = req.session.redirectTo || '/';
//get the redirection value if it was set.
delete req.session.redirectTo;
//Now that we've got it, delete it.
res.redirect(red);
//redirect
});
})(req, res);
},
logout: function (req, res) {
req.logout();
res.redirect('/');
}
};
config/passport.js
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
bcrypt = require('bcrypt-nodejs');
passport.serializeUser(function (user, done) {
console.log("Serialize User (passport.js) ", user);
// if(user==false || user == undefined){
// done({error:'user is not a user object, but is false or undefined'});
// }
// done(null, user.user_id);
done(null,user.user_id);
});
passport.deserializeUser(function (id, done) {
console.log("ID COMING IN AS: ", id);
Users.findOne({
user_id: id
}, function (err, user) {
return done(err, user);
});
});
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'user_password'
},
function (un, password, done) {
console.log("Passport Strategy ", un,password);
Users.findOne({
username: un
}, function (err, user) {
if (err) {
console.log("USER.FINDONE ERROR ", err);
return done(err,false,{message:'Can\'t find user'});
}
if (!user) {
return done(null, false, {
message: 'Incorrect Username <small>Are you sure you signed up?</small>'
});
}
console.log('user found');
if (bcrypt.compareSync(password, user.user_password)) {
console.log('passwords are good');
return done(null, user, {
message: 'Logged In Successfully'
});
} else {
return done(null, false, {
message: 'Invalid Password'
});
}
});
}
));
config/http.js(以防万一)
passportInit: require('passport').initialize(),
passportSession: require('passport').session(),
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'passportInit',
'passportSession',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'router',
'www',
'favicon',
'404',
'500'
],
SQL 为 table
CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
`user_password` varchar(255) DEFAULT NULL,
`user_salt` varchar(100) NOT NULL,
`user_email` varchar(255) NOT NULL,
`user_first_name` varchar(100) DEFAULT NULL,
`user_last_name` varchar(255) DEFAULT NULL,
`user_display_name` varchar(255) DEFAULT NULL,
UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB
感谢您的时间和耐心。
问题是你有两组用于 Passport 身份验证的库:sails-auth
包(包括一些模型、控制器、路由等)和 passport
+ passport-local
包(只是普通的 Passport 库)。看起来您实际上根本没有使用 sails-auth
,但它仍然挂钩到您的应用程序并进行自己的 Passport 配置。我想这就是为什么您的 passport.serializeUser()
函数永远不会 "activated".
从您的 package.json
文件和 node_modules/
目录中删除 sails-auth
以修复您的设置。
我还在努力将护照添加到我的申请中!我明白了,这样我就不会再看到以前看到的疯狂的巨大错误,但应用程序一直在输出 {}
。因此,在尽可能多地输入 console.log()
语句后,我将范围缩小到应用程序说它无法序列化用户对象这一事实,但据我所知 passport.serializeUser()
函数永远不会被调用。
GitHub link with all files (other than node modules)
当然,我不是 100% 了解 passport 的工作原理,而且我是 Node 的超级新手,但有多年使用其他语言的经验,所以如果我需要,我可以手工完成,但我'我更喜欢使用护照,因为它允许我最终使用 Facebook 和 Google 身份验证而无需重新制作轮子,可以这么说。
错误
这是确切的错误:
Passport Strategy jhechtf (password)
user found
passwords are good
Passport Authenticate : jhechtf
Passport Authenticate Err: null
Passport Authenticate Info: { message: 'Logged In Successfully' }
AuthController Error: [Error: Failed to serialize user into session]
现在我用 google 搜索了 "Failed to serialize user into session passport.js" 几乎所有可以想象到的术语,但每次它似乎总是带有 deserializeUser
而不是 serializeUser
。让我印象深刻的一件事是,我从 serializeUser()
发出的 console.log()
呼叫在任何时间点都没有被看到。
AuthController.js
var passport = require('passport');
module.exports = {
_config: {
actions: false,
shortcuts: false,
rest: false
},
login: function (req, res) {
passport.authenticate('local', function (err, user, info) {
if(user==false){
return res.status(403).send(info);
}
console.log("Passport Authenticate : ", user.username);
console.log("Passport Authenticate Err: ", err);
console.log("Passport Authenticate Info: ", info);
req.logIn(user, function (err) {
if (err) {
console.log("AuthController Error: " , err);
return res.status(401).send(err);
}
//Assume a correct login?
var red = req.session.redirectTo || '/';
//get the redirection value if it was set.
delete req.session.redirectTo;
//Now that we've got it, delete it.
res.redirect(red);
//redirect
});
})(req, res);
},
logout: function (req, res) {
req.logout();
res.redirect('/');
}
};
config/passport.js
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
bcrypt = require('bcrypt-nodejs');
passport.serializeUser(function (user, done) {
console.log("Serialize User (passport.js) ", user);
// if(user==false || user == undefined){
// done({error:'user is not a user object, but is false or undefined'});
// }
// done(null, user.user_id);
done(null,user.user_id);
});
passport.deserializeUser(function (id, done) {
console.log("ID COMING IN AS: ", id);
Users.findOne({
user_id: id
}, function (err, user) {
return done(err, user);
});
});
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'user_password'
},
function (un, password, done) {
console.log("Passport Strategy ", un,password);
Users.findOne({
username: un
}, function (err, user) {
if (err) {
console.log("USER.FINDONE ERROR ", err);
return done(err,false,{message:'Can\'t find user'});
}
if (!user) {
return done(null, false, {
message: 'Incorrect Username <small>Are you sure you signed up?</small>'
});
}
console.log('user found');
if (bcrypt.compareSync(password, user.user_password)) {
console.log('passwords are good');
return done(null, user, {
message: 'Logged In Successfully'
});
} else {
return done(null, false, {
message: 'Invalid Password'
});
}
});
}
));
config/http.js(以防万一)
passportInit: require('passport').initialize(),
passportSession: require('passport').session(),
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'passportInit',
'passportSession',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'router',
'www',
'favicon',
'404',
'500'
],
SQL 为 table
CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
`user_password` varchar(255) DEFAULT NULL,
`user_salt` varchar(100) NOT NULL,
`user_email` varchar(255) NOT NULL,
`user_first_name` varchar(100) DEFAULT NULL,
`user_last_name` varchar(255) DEFAULT NULL,
`user_display_name` varchar(255) DEFAULT NULL,
UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB
感谢您的时间和耐心。
问题是你有两组用于 Passport 身份验证的库:sails-auth
包(包括一些模型、控制器、路由等)和 passport
+ passport-local
包(只是普通的 Passport 库)。看起来您实际上根本没有使用 sails-auth
,但它仍然挂钩到您的应用程序并进行自己的 Passport 配置。我想这就是为什么您的 passport.serializeUser()
函数永远不会 "activated".
从您的 package.json
文件和 node_modules/
目录中删除 sails-auth
以修复您的设置。