2015-02-02 2 views
5

genannt Ich verwende Express (v4.11.2) mit Passport, um mehrere Provider (lokal, Facebook, Twitter und Google) für den Zugang zu unterstützen die Web-App, die ich baue. Als Backend verwende ich mysql. Im Moment habe ich zwei lokale Strategien: local-signup und local-signin. Das Problem, das ich erfahre, ist, dass die req.session.passport und req.user immer leer sind und dass in der Tat serializeUser und deserializeUser nie aufgerufen werden.req.session.passport und req.user leer, serializeUser und deserializeUser nie

Hier ist die Einrichtung von Express-und Pass:

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 

und hier ist die Pass-Datei mit Authentifizierungsstrategien:

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

und zum letzten, hier ist, wie ich das bin mit Strategien in Express-Routen:

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

Alles funktioniert gut, auch in einer Strategie kann ich den Wert festlegen der Benutzer-ID in der Sitzung wie folgt aus:

req.session.user_id = user.id 

und weiterhin manuell bedienen, aber ich nicht bekommen, warum serializeUser und deserializeUser wirklich nicht genannt zu werden.

Antwort

12

Sie müssen req.login() in custom callback nennen, die dann serializeUser anrufen und das Benutzerobjekt auf die Sitzung festgelegt:

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

das war es. Danke für deine Hilfe :) – Neman

+0

Danke, du hast meinen Tag gerettet :) – Ardian

Verwandte Themen