2015-02-02 9 views
5

Używam Express (v4.11.2) z paszportem w celu obsługi wielu dostawców (lokalnych, Facebook, Twitter i Google) w celu uzyskania dostępu do aplikacja internetowa, którą buduję. Jako backend używam mysql. Na razie mam dwie strategie lokalne: lokalną rejestrację i lokalne logowanie. Problem, którego doświadczam, polega na tym, że req.session.passport i req.user są zawsze puste i że w rzeczywistości serializeUser i deserializeUser nigdy nie są wywoływane.req.session.passport i req.user puste, serializeUżytkownik i deserializatorUżytkownicy nigdy nie są nazywane

Oto konfiguracja wyraźnej i paszport:

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 

i tutaj jest plik paszport ze strategiami uwierzytelniania:

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'}); 
         } 
        }); 
       }); 
      }) 
    ); 
}; 

i, na koniec, oto jak Używam strategie na trasach ekspresowych:

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); 
}); 

Wszystko działa dobrze, nawet w strategii mogę ustawić wartość id użytkownika w sesji jak ta:

req.session.user_id = user.id 

i nadal go używać ręcznie, ale ja naprawdę nie rozumiem dlaczego serializeUser i deserializeUser nie są nazywane.

Odpowiedz

12

Trzeba zadzwonić req.login() w custom callback który będzie następnie zadzwonić serializeUser i ustawić obiekt użytkownika do sesji:

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

że było. Dzięki za pomoc :) – Neman

+0

Dzięki, zaoszczędzisz mój dzień :) – Ardian

Powiązane problemy