戦略の実装はpassport.authenticate
、リクエストの認証と成功/失敗の処理の両方に関連して機能します。
このルートを使用しているとします (電子メール アドレスとパスワードが渡されます)。
app.post('/login', passport.authenticate('local', {
successRedirect: '/loggedin',
failureRedirect: '/login', // see text
failureFlash: true // optional, see text as well
});
これにより、戦略のコードが呼び出され、次の 3 つの条件のいずれかが発生する可能性があります。
- ユーザーの情報をフェッチしようとして内部エラーが発生しました (データベース接続が切断されたとします)。このエラーは次のように渡されます:
next(err)
; これは Express によって処理され、HTTP 500 応答が生成されます。
- 指定された資格情報が無効です (指定された電子メール アドレスを持つユーザーがいないか、パスワードが一致しません)。その場合、エラーは生成されませんが
false
、ユーザー オブジェクトとしてa を渡しますnext(null, false)
。これによりトリガーされfailureRedirect
ます (定義しない場合、HTTP 401 Unauthorized 応答が生成されます);
- すべてがチェックアウトされ、有効なユーザー オブジェクトが得られたので、それを渡します
next(null, user)
。successRedirect
これにより、 ;がトリガーされます。
無効な認証 (内部エラーではない) の場合、コールバックとともに追加のメッセージを渡すことができます。
next(null, false, { message : 'invalid e-mail address or password' });
connect-flash ミドルウェアを使用failureFlash
してインストールした場合、提供されたメッセージはセッションに保存され、たとえばテンプレートで使用するために簡単にアクセスできます。
編集:認証プロセスの結果を自分で完全に処理することもできます (Passport がリダイレクトまたは 401 を送信する代わりに):
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (! user) {
return res.send({ success : false, message : 'authentication failed' });
}
// ***********************************************************************
// "Note that when using a custom callback, it becomes the application's
// responsibility to establish a session (by calling req.login()) and send
// a response."
// Source: http://passportjs.org/docs
// ***********************************************************************
req.login(user, loginErr => {
if (loginErr) {
return next(loginErr);
}
return res.send({ success : true, message : 'authentication succeeded' });
});
})(req, res, next);
});