【问题标题】:passport Error: Failed to serialize user into session护照错误:无法将用户序列化到会话中
【发布时间】:2019-03-26 11:17:19
【问题描述】:

我对使用 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('/');
  });
};

model.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,
  };

【问题讨论】:

    标签: mysql node.js express passport.js passport-local


    【解决方案1】:

    也许你的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]);
            }
          });
    

    ?

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 1970-01-01
      • 2021-03-14
      • 2015-06-17
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2012-09-19
      相关资源
      最近更新 更多