2016-09-28 2 views
0

Ich habe zwei Modelle Benutzer und Admin. Beide haben ihre eigenen Routendateien users.js und admins.js und ihre eigenen lokalen Strategien. Benutzer verwenden E-Mail zur Authentifizierung, während Admin Benutzernamen verwendet. Beide haben also ihre eigene "pass.use", aber wenn sie post '/ login' für Benutzer verwenden, wird sie irgendwie als "pass.use" von admins bezeichnet. Ich weiß nicht warum. Hier ist der users.js Code: -Kollision mit lokalen Strategien Pass in zwei separaten Dateien

var express = require('express'); 
var router = express.Router(); 
var bodyParser=require('body-parser'); 
var User=require('../models/user'); 
var passport=require('passport'); 
var localStrategy=require('passport-local').Strategy; 

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!user) { 
     return res.send('User not found'); 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.json(user); 
    }); 
    })(req, res, next); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

//this doesnt seem to work..doesnt call this one 
passport.use(new localStrategy({usernameField:'email', passwordField:'password'},function(email,password,done){ 
    User.getUserByUsername(email, function(err,user){ 
     if(err) throw err; 
     if(!user){ 
     return done(null,false,{message: 'User not found'}); 
     } 

     User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, user); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

Und das ist admins.js Code: -

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, admin, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!admin) { 
     return res.send('Admin not found'); 
    } 
    req.logIn(admin, function(err) { 
     if (err) { return next(err); } 
     return res.json(admin); 
    }); 
    })(req, res, next); 
}); 

//for sessions 
passport.serializeUser(function(admin, done) { 
    done(null, admin.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    Admin.getAdminById(id, function(err, admin) { 
    done(err, admin); 
    }); 
}); 
    //this gets called even when im calling /users/login 
    passport.use(new localStrategy(function(username,password,done){ 
    Admin.getAdminByUsername(username, function(err,admin){ 
     if(err) throw err; 
     if(!admin){ 
     return done(null,false,{message: 'Admin not found'}); 
     } 

     Admin.comparePassword(password, admin.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, admin); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

Beachten Sie, dass diese beiden Dateien sind auf dem gleichen Niveau unter Routen folder..and ihre Modelldateien befinden sich im Modellordner wieder auf der gleichen Ebene. Der Admin funktioniert perfekt, aber die Benutzerauthentifizierung findet nicht statt.

Antwort

1

Das Problem ist, dass passport.use() als optionalen ersten Parameter den logischen Namen verwendet, um eine Strategie zu beschreiben. Jeder Strategiealgorithmus stellt seinen eigenen Standardnamen zur Verfügung. Und wenn Sie eine Authentifizierung durchführen, wählen Sie das Pass-Framework, um die Strategie basierend auf diesem Namen auszuwählen. In Ihrem Fall also die letzte Registrierung für den local Namen (der Standardname für die lokale Strategie) Sie holen den letzten für diesen Namen registrierten Algorithmus.

Eine Lösung wird die folgende Änderung auf users.js Code auszuführen:

var User=require('../models/user'); 
var passport=require('passport'); 
var localStrategy=require('passport-local').Strategy; 

router.post('/login', function(req, res, next) { 
    passport.authenticate('local-users', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!user) { 
     return res.send('User not found'); 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.json(user); 
    }); 
    })(req, res, next); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

//this doesnt seem to work..doesnt call this one 
passport.use('local-users', new localStrategy({usernameField:'email', passwordField:'password'},function(email,password,done){ 
    User.getUserByUsername(email, function(err,user){ 
     if(err) throw err; 
     if(!user){ 
     return done(null,false,{message: 'User not found'}); 
     } 

     User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, user); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

Wie Sie wir bieten eine alternative Strategie Namen für die LocalStrategy auf den Kontext des Benutzermoduls sehen. Und wir verwenden die Strategie (unter passport.authenticate Aufruf) mit diesem spezifischen Strategie-Namen.

+0

Vielen Dank Kumpel. Konnte dieses Ding in der Dokumentation nicht finden oder vielleicht habe ich es verpasst. Klappt wunderbar. Du hast meinen Tag gerettet –

Verwandte Themen