Passport.JS: Ошибка: не удалось десериализовать пользователя вне сеанса - PullRequest
0 голосов
/ 11 мая 2018

Я использую 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;

1 Ответ

0 голосов
/ 12 мая 2018

Я нашел решение. Местная стратегия возвращала это в случае успеха:

return done(null, true);

Когда он должен вернуться:

return done(null, results[0].id);
...