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

У меня есть небольшая проблема с 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,
  };

1 Ответ

0 голосов
/ 22 октября 2018

Возможно, Ваш RowDataPacket не является обычным объектом, поэтому я думаю, вам нужно изменить код

dbServerConnection.query(queryString, Object.values(query), (error, results) => {
        if (error) {
          reject(error);
        } else {
          console.log(results);
          resolve(results);
        }
      });

на

dbServerConnection.query(queryString, Object.values(query), (error, results) => {
        if (error) {
          reject(error);
        } else {
          resolve(results[0]);
        }
      });

?

...