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.
Vielen Dank Kumpel. Konnte dieses Ding in der Dokumentation nicht finden oder vielleicht habe ich es verpasst. Klappt wunderbar. Du hast meinen Tag gerettet –