2015-02-02 6 views
5

Utilizzo Express (v4.11.2) con Passport per supportare più provider (locali, facebook, twitter e google) per l'accesso a l'app Web che sto costruendo. Come backend sto usando mysql. Per ora ho due strategie locali: local-signup e local-signin. Il problema che sto vivendo è che req.session.passport e req.user sono sempre vuoti e che, di fatto, serializeUser e deserializeUser non vengono mai chiamati.req.session.passport e req.user vuoto, serializeUser e deserializeUser non vengono mai chiamati

Ecco la messa a punto di espresso e passaporto:

var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var MemoryStore = session.MemoryStore; 
var _ = require('underscore'); 
var passport = require('passport'); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(session({ 
    key: 'KEY', 
    secret: 'SECRET331156%^!fafsdaasd', 
    store: new MemoryStore({reapInterval: 60000 * 10}), 
    saveUninitialized: true, 
    resave: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
require('./config/passport')(passport); // pass passport for configuration 

e qui è il file del passaporto con le strategie di autenticazione:

module.exports = function (passport) { 
    passport.serializeUser(function (user, done) { 
     logger.info('SERIALIZE USER'); 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function (id, done) { 
     logger.info('DESEIRALIZE USER!'); 
     mysqllib.getConnection(function (err, connection) { 
      if (err) { 
       done(err); 
      } 
      var sql = "SELECT * FROM users WHERE idusers = ?"; 
      logger.info('sql: ' + sql); 
      connection.query(sql, [id], function (err, rows) { 
       connection.release(); 
       var user = {}; 
       user.id = rows[0].idusers; 
       done(err, user.id); 
      }); 
     }); 
    }); 

    passport.use('local-signup', new LocalStrategy({ 
      usernameField: 'email', 
      passwordField: 'password', 
      passReqToCallback: true // allows us to pass back the entire request to the callback 
     }, 
     function (req, email, password, done) { 
      logger.info('CALLING local-signup'); 
      var firstname = req.body.firstname; 
      var lastname = req.body.lastname; 
      var role = req.body.role; 
      mysqllib.getConnection(function (err, connection) { 
       var sql = "INSERT INTO users VALUES(0, ?, ?, ?, ?, null, ?, 0, null, null, null, null, null, null, 0, 0)"; 
       logger.info('sql: ' + sql); 
       connection.query(sql, [email, password, firstname, lastname, role], function (err, rows) { 
        connection.release(); 
        if (err) { 
         if (err.code == 'ER_DUP_ENTRY') { 
          logger.info('er_dup_entry'); 
          return done(err); 
         } else { 
          logger.info('general err'); 
          return done(err); 
         } 
        } else { 
         logger.info('everything is OK!'); 
         var user = {}; 
         user.id = rows.insertId; 
         req.session.user_auth = user.id; 
         return done(null, user); 
        } 
       }); 
      }); 
     })); 

    passport.use(
     'local-login', 
     new LocalStrategy({ 
       usernameField: 'email', 
       passwordField: 'password', 
       passReqToCallback: true // allows us to pass back the entire request to the callback 
      }, 
      function (req, email, password, done) { 
       mysqllib.getConnection(function (err, connection) { 
        if (err) { 
         logger.info('getConnection: ' + err); 
         return done(err); 
        } 
        var sql = "SELECT idusers, first_name, last_name, email, phone, dob, address, role, photo1, photo2, photo3, photo4, phonevalidated, uservalidated FROM users WHERE email = " + connection.escape(email) + " AND password = " + connection.escape(password); 
        connection.query(sql, function (err, rows) { 
         connection.release(); 
         if (err) { 
          logger.error("select user", err); 
          return done(err); 
         } else if (rows.length) { 
          var user = rows[0]; 
          user.id = rows[0].idusers; 
          return done(null, user); 
         } else { 
          logger.warn('Incorrect Login credentials, username: ' + email + ' password: ' + password); 
          return done(null, false, {message: 'unauthorized'}); 
         } 
        }); 
       }); 
      }) 
    ); 
}; 

e, per ultima, ecco come lo sto usando il strategie nei percorsi espressi:

app.post('/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user, info) { 
     if (err) { 
      mysend(res, 500, 'Ups. Something broke!'); 
     } else if (info) { 
      mysend(res, 401, 'unauthorized'); 
     } else { 
      mysend(res, 200, JSON.stringify(user)); 
      logger.info(req.user); 
      logger.info(req.session); 
     } 
    })(req, res, next); 
}); 

Tutto funziona, anche in una strategia posso impostare il valore di id dell'utente nella sessione in questo modo:

req.session.user_id = user.id 

e continuare a utilizzare manualmente, ma io davvero non capisco perché serializeUser e deserializeUser non vengono chiamati.

risposta

12

È necessario chiamare req.login() in custom callback che sarà quindi chiamare serializeUser e impostare l'oggetto utente alla sessione:

app.post('/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user, info) { 
     if (err) { 
      mysend(res, 500, 'Ups. Something broke!'); 
     } else if (info) { 
      mysend(res, 401, 'unauthorized'); 
     } else { 
      req.login(user, function(err) { 
       if (err) { 
        mysend(res, 500, 'Ups.'); 
       } else { 
        mysend(res, 200, JSON.stringify(user)); 
       } 
      } 
     } 
    })(req, res, next); 
}); 
+0

che è stato. Grazie per il tuo aiuto :) – Neman

+0

Grazie, hai salvato la mia giornata :) – Ardian