2016-09-28 8 views
0

私は2つのモデルuserとadminを持っています。彼らは両方とも独自のルートファイルusers.jsとadmins.jsと独自のローカル戦略を持っています。ユーザーは認証に電子メールを使用し、管理者はユーザー名を使用します。だから、彼らはどちらも "passport.use"を持っていますが、ユーザーのためにpost/loginを使うと、何とかadminの "passport.use"と呼ばれます。どうしてか分かりません。ここ はusers.jsコードです: -ローカルストラテジーとの衝突2つの別々のファイルのパスポート

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

    })); 

そして、これはadmins.jsコードです: - これらのファイルの両方がルートの下に同じレベルであることがfolder..and

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

    })); 

注彼らモデルファイルは同じレベルのモデルフォルダに再びあります。管理者は完全に動作しますが、ユーザ認証は起こりません。

答えて

1

passport.use()は、オプションの最初のパラメータとして戦略を説明するために使用される論理名をとります。すべての戦略アルゴリズムは、独自のデフォルト名を提供します。認証を実行すると、パスポートフレームワークはその名前に基づいて戦略を選択します。したがって、あなたのケースでは、local(ローカル戦略のデフォルト名)の最後の登録が、その名前に登録された最後のアルゴリズムをフェッチしています。あなたは私たちがユーザモジュールのコンテキストにLocalStrategyの代替戦略名を提供している見ることができるように

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

    })); 

ソリューションはusers.jsコードで以下の変更を実行することになります。この特定の戦略名を使用して戦略(passport.authenticateコール)を使用しています。

+0

ありがとうございました。ドキュメントでこのことを見つけることができなかったかもしれません。魅力のように動作します。あなたは私の一日を救った –

関連する問題