2012-08-31 25 views
20

と呼ばれていないコールバックを認証し、私はエラー条件は、次のコードを使用して発生したときに何が起こるかをテストしていた:?NodejsパスポートNodejsパスポートを使用して

passport.use(new LocalStrategy(
    function(username, password, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 
     findByUsername(username, function(err, user) { 
    console.log('in auth function'); 
     return done('errortest'); 
     if (err) { return done(err); } 
     if (!user) { 
      return done(null, false, { message: 'Unknown user ' + username }); 
     } 
     if (user.password != password) { 
      return done(null, false, { message: 'Invalid password' }); 
     } 
     return done(null, user); 
     }) 
    }); 
    } 
)); 

app.get('/logintest', function(req, res, next) { 
console.log('before authenticate'); 
    passport.authenticate('local', function(err, user, info) { 
console.log('authenticate callback'); 
    if (err) { return res.send({'status':'err','message':err.message}); } 
    if (!user) { return res.send({'status':'fail','message':info.message}); } 
    req.logIn(user, function(err) { 
     if (err) { return res.send({'status':'err','message':err.message}); } 
     return res.send({'status':'ok'}); 
    }); 
    })(req, res, next); 
}); 

ルートを使用して/ logintestユーザ名=ボブ&パスワード= S私は、「コールバックを認証」「認証機能で」その後、「認証前」、コンソールに表示することが予想されるが、それは唯一の「errortest」に続く最初の二つを示し、「errortestは」ブラウザに表示されます。

Iはまたreturn done({'message':'test'});および「[対象オブジェクトは」コンソールで、ブラウザに表示されていた試みました。

が、これは正常に動作していないか、私が何かをしないのですか?

EDIT:ジャレッド・ハンソンの応答を1として、(app.getする3番目の引数としてこのエラーハンドラ関数を追加することは)私は、エラーをキャッチし、適切なJSONを返すことができます:

... 
    })(req, res, next); 
    }, 
    function(err, req, res, next) { 
    // failure in login test route 
    return res.send({'status':'err','message':err.message}); 
    }); 

答えて

14

あなたが理解していますそれは完全に、そしてその意図どおりの働きをしています。

エラーは、そのエラーとパスポートのすぐnext()年代を発生した場合。カスタム的にそのエラーを処理する場合:あなたは、ミドルウェア(http://expressjs.com/guide/error-handling.html詳細)エラー処理を使用することができます。

カスタムコールバックは、主に認証の成功または失敗を処理するために使用されます(user == false)。 DB接続などのエラーは、上記のエラー処理ミドルウェアを優先してコールバックに返されません。私はこれを変えることを検討しましたが、説得力のある理由は見つかりませんでした。しかし、上記でカバーされていないユースケースがある場合は、教えてください。

+1

感謝。私はnode.jsをかなり使い慣れていますが、ユースケースはjquery ajax呼び出しを介してログインしています。成功した場合は「ok」、エラーが発生した場合は悪いユーザ名/パスワードが「失敗」、失敗した場合は「err」というステータスのjsonオブジェクトを返したいとします。 (私は成功のために作られたコードの編集に注意してください。) – KevinVictor

+0

カスタムコールバックが呼び出されたときに、常にerrはnullですか? – KevinVictor

+0

GitHubの問題についてフォローアップを投稿しました。コードをより適切にフォーマットすることができました。 https://github.com/jaredhanson/passport-local/issues/15 –

4

bodyparser.json()は私の問題を引き起こしていた、私はこのような(特にパスポートルート上)ルートごとにそれを設定することで、それを修正:迅速な対応のための

app.post('/login', bodyParser.urlencoded({ extended: true }), function (req, res, next) { 
      passport.authenticate('local', function (err, user, info) { 
       if (err) { return next(err) } 
       if (!user) { 
        console.log('bad'); 
        req.session.messages = [info.message]; 
        return res.redirect('/login') 
       } 
       req.logIn(user, function (err) { 
        console.log('good'); 
        if (err) { return next(err); } 
        return res.redirect('/'); 
       }); 
      })(req, res, next); 
    }); 
関連する問題