Я использую Passport.JS с express-session и базой данных MySQL для обработки аутентификации пользователя.Все работало нормально, пока я не удалил все сеансы из базы данных «сеансы» и всех пользователей из базы данных «пользователи».С тех пор я продолжаю получать сообщение об ошибке:
'Не удалось десериализовать пользователя вне сеанса'
User_id в функции deserialize () выглядит как bool, что верно.До того, как я удалил пользователей и сеансы, это был идентификатор, который позволил мне получить пользователя из базы данных.
Это мой код:
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
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;
сеанс TABLE
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;