2017-04-02 8 views
0

ローカル戦略でパスポート認証を使用しようとしていますが、毎回認証が失敗し、ローカル戦略に移行しません。 コードが脱線された場所を確認するためにいくつかのコンソールログを追加しましたが、何も記録されていません。Passport認証が合格しない

users.js(ルータ)

var express = require('express'); 
var router = express.Router(); 
var User = require('../models/user'); 
var multer=require('multer'); 
var passport=require('passport'); 
var LocalStrategy=require('passport-local').Strategy; 

/* GET users listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

router.get('/register', function(req, res, next) { 
    res.render('register',{ 
    'title':'Register' 
    }); 
}); 

router.get('/login', function(req, res, next) { 
    res.render('login',{ 
    'title':'Login' 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username,password,done){ 
     console.log('words'); 
     User.getUserByUsername(username,function(err,user){ 
      if (err) throw err; 
      if(!user){ 
       console.log('Unknown user'); 
       return done(null,false); 
      } 
     }); 
    } 
)); 

router.post('/login',passport.authenticate('local',{failureRedirect:'/users/register'}),function(req,res){ 
    console.log('Authentication succesful'); 
    req.flash('success','You are logged in'); 
    res.redirect('/'); 
}); 

module.exports = router; 

答えて

1

あなたは、セッションを設定し、ルータにパスポートを追加しましたか?私は2つの異なる場所でinitializeとsessionメソッドを設定するのがうまくいくかどうか分かりません。 これは、私はそれがうまく作られたかである:すべてが、これは今までに生産に入る場合は、ルートMongoStoreやRedisの

のような表現・セッションとは異なるセッションハンドラを必要とするさらに、ルータに

let express = require('express'); 
let session = require('express-session'); 
let passport = require('passport'); 
let LocalStrategy = require('passport-local').Strategy; 
let router = express.Router(); 

passport.use(new LocalStrategy(
function(username, password, done) { 
    User.findOne({username: username}, function (err, user) { 
      if (err) { return done(err); } 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      user.comparePassword(password, function (err, isMatch) { 
       if (err) { return done(err); } 
       if(!isMatch){ 
        return done(null, false, { message: 'Incorrect password.' }); 
       } else { 
        return done(null, user); 
       } 
      }); 
     }); 
    } 

)); 
passport.serializeUser(function(user, done) { 
     done(null, {email: user.email, roles : user.roles}); 
}); 
passport.deserializeUser(function(session, done) { 
    User.findOne({email: session.email}, function(err, user) { 
      done(err, user); 
    }); 
}); 
router.use(session({ secret: 'my super secret',name: 'my-id', resave: false, saveUninitialized: false })); 

router.use(passport.initialize()); 
router.use(passport.session()); 

を中に設定

/* GET home page. */ 
router.get('/', require('connect-ensure-login').ensureLoggedIn('login'), function (req, res, next) { 
    if (req.user) { 
     res.render('index'); 
    } else { 
     res.redirect('/login'); 
    } 
}); 

router.get('/login', function (req, res, next) { 
    res.render('login'); 
}); 
router.post('/login', passport.authenticate('local', { 
    successRedirect: '/', 
    failureRedirect: '/login' 
})); 

router.get('/logout', function (req, res) { 
req.logout(); 
res.render('logout'); 
}); 
+0

私はapp.jsファイルでこれを行いました。私もルータでそれを行う必要がありますか?私はこれを試しても、それはまだ認証に失敗します。正しいパスワードでもリダイレクトされます –

+0

あなたのコードを読み直しましたが、passport.use(new LocalStrategy(..))で成功したdone()コールを返さないためかもしれません。あなたはエラーを投げたり、done(null、false)を返します。しかしあなたはdone(null、true || user)を返しません。 –

+0

私はリターンコールでそれを編集しましたが、まだ運がありません。また、私のconsole.logのどれもが呼び出されていないので、ローカル戦略に到達していないと思います。 passport.authenticate( 'local'、{failureRedirect: '/ users/register'})を取り出すと、ポストが正しく実行され、その機能に問題があると思うでしょう。 –

関連する問題