我正在使用Passport.JS、express-session和MySQL数据库来处理用户身份验证。在从'database sessions'中删除所有会话和从'database users'中删除所有用户之后,一切都正常运行。然而自从那时起,我一直收到错误提示:“无法从会话中反序列化用户”。deserialize()函数中的user_id似乎是一个布尔值,它是真实存在的。在删除用户和会话之前,这是一个允许我从数据库中抓取用户的ID。以下是我的代码:
SETUP
var express = require('express'),
app = express(),
bodyParser = require('body-parser'),
mysql = require('mysql'),
generator = require('generate-password'),
cookieParser = require('cookie-parser'),
expressValidator = require('express-validator'),
session = require('express-session'),
passport = require('passport'),
MySQLStore = require('express-mysql-session')(session),
LocalStrategy = require('passport-local').Strategy,
bcrypt = require('bcrypt');
const saltRounds = 10;
app.set("view engine", "ejs");
app.use(express.static(__dirname + "/public"));
app.use(bodyParser.urlencoded({extended: true}));
app.use(expressValidator());
app.use(cookieParser());
var options = {
host : 'localhost',
user : 'eliasal',
database : "c9",
password : ""
};
var sessionStore = new MySQLStore(options);
app.use(session({
secret: 'dfsfjdssdvsdvawdslepsv',
resave: true,
store: sessionStore,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
//Start MYSQL database
var connection = mysql.createConnection({
host : 'localhost',
user : 'eliasal',
database : "c9",
password : "",
multipleStatements: true
});
connection.connect(function(err){
if(!err) {
console.log("Database is connected ...");
} else {
console.log("Error connecting database ...");
}
});
LOGIN ROUTE
//login
app.post("/login", passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
}), function(req, res, info){
res.render('/');
});
序列化、反序列化和本地策略
passport.serializeUser(function(user_id, done){
console.log(user_id);
done(null, user_id);
});
passport.deserializeUser(function(user_id, done){
console.log('USER ID : ' + user_id);
connection.query('SELECT * FROM users WHERE id = ?', [user_id], function (err, rows){
console.log('RESULT : ' + rows);
done(err, rows[0]);
});
});
//Authenticate users
passport.use(new LocalStrategy(
function(username, password, done) {
connection.query('SELECT password, salt FROM users WHERE email = ?', [username], function(err, results, fields){
//DB error
if(err) {done(err)};
//no user was found
if(results.length === 0) {
done(null, false);
} else {
var salt = results[0].salt;
if(bcrypt.hashSync(password, salt) === results[0].password) {
//Success
return done(null, true);
} else {
//Wrong password
return done(null, false);
}
}
});
}
));
function isAuthenticated(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect('/login');
}
用户表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`last_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`salt` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`user_role` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
会话表
CREATE TABLE IF NOT EXISTS `sessions` (
`session_id` varchar(128) COLLATE utf8mb4_bin NOT NULL,
`expires` int(11) unsigned NOT NULL,
`data` text COLLATE utf8mb4_bin,
PRIMARY KEY (`session_id`)
) ENGINE=InnoDB;