У меня есть небольшая проблема с passport-local при использовании mySQL-DB.
При попытке войти в систему появляется следующее сообщение об ошибке:
Ошибка: не удалось сериализовать пользователяв сеанс
в /your/path/to/project/auth.js:11:5
Запрос вроде бы в порядке.В ответ я получаю правильный объект.
[ RowDataPacket {
id: 1,
firstname: 'firstname',
lastname: 'lastname',
username: 'username',
password: 'password in hash',
role: 'role',
enabled: 1 } ]
Но если я
console.log(user)
в
passport.serializeUser
, я получу
[]
Заранее спасибо: -)
В auth.js
const passport = require('passport');
const expressSession = require('express-session');
const LocalStrategy = require('passport-local');
const crypto = require('crypto');
const userModel = require('./user/model');
module.exports = app => {
passport.serializeUser(function(user, done){
//console.log(user.id);
done(null, user.id);
})
//passport.serializeUser((user, done) => done(null, user.id));
passport.deserializeUser((id, done) => {
userModel.get({ id }).then(
user => {
if (!user) {
done('user not found');
}
done(null, user);
},
err => done(err),
);
});
passport.use(
new LocalStrategy((username, password, done) => {
const hash = crypto
.createHash('md5')
.update(password)
.digest('hex');
console.log({password: hash});
userModel.get({ username, password: hash }).then(
user => {
if (!user) {
done('user not found');
}
//console.log(user);
done(null, user);
},
error => done('FEHLER: ' + error),
);
}),
);
app.use(
expressSession({
secret: 'geheim',
resave: false,
saveUninitialized: true,
cookie: {secure: true}
}),
);
app.use(passport.initialize());
app.use(passport.session());
app.post(
'/login',
passport.authenticate('local', { failureRedirect: '/login' }),
(request, response) => {
response.redirect('/');
},
);
app.get('/logout', (req, res) => {
req.logout();
res.redirect('/');
});
};
Модель. Js
'use strict';
const dbServerConnection = require('../controller/mysqlconnector.js');
function get(query = {}) {
return new Promise((resolve, reject) => {
let queryElements = [];
if (query) {
for (let key in query) {
queryElements.push(`${key} = ?`);
}
}
const queryString =
'SELECT * FROM usertable WHERE ' + queryElements.join(' AND ');
dbServerConnection.query(queryString, Object.values(query), (error, results) => {
if (error) {
reject(error);
} else {
console.log(results);
resolve(results);
}
});
});
}
module.exports = {
get,
};