2012-03-13 9 views
2

私はExpress/Mongoose web-appにpassport-localを正常に実装しましたが、失敗したログインメッセージを適切にレンダリングする方法がわかりません。私は無効なログインを報告することになっていますどのようなルートでExpressとPassportJSで無効なログインを正しく報告するにはどうすればよいですか?

app.get('/login', function(req, res) { 
    res.render('user/login', { 
    }); 
}); 

は、ここに私のログインルートですか?ログインが成功した場合、は、req.userオブジェクトには"GET /login"のルートに役立ちません。成功すると、行きたいページにリダイレクトされるためです。

req.userは、ログインページGETの場合、常にundefinedとなります。

「yo、invalid login!」のようなメッセージを書き出すことができます。

  1. ユーザーは存在しません。
  2. 指定されたパスワードは一致しませんが、ユーザーは存在しています。

何が発生したかによって、別のメッセージを出力したいことがあります。あなたはそこにいくつかの問題があるが、これはPassportJSの著者は彼のアプリケーションを設定する方法である見ることができるように

passport.use(new LocalStrategy({ 
    usernameField: 'email' 
}, 
function(email, password, fn) { 
    User.findOne({'login.email': email}, function(err, user) { 
    // Error was thrown. 
    if (err) { 
     return fn(err); 
    } 

    // User does not exist. 
    if (!user) { 
     return fn(null, false); 
    } 

    // Passwords do not match. 
    if (user.login.password != utility.encryptString(user.login.salt + password)) { 
     return fn(null, false); 
    } 

    // Everything is good. 
    return fn(null, user); 
    }); 
} 
)); 

:私はLocalStrategyを実装する場合

私はこのコードを使用していました。どのように戦略が返すものにアクセスする必要がありますか?

エラーが発生した場合は、errにアクセスするために何を呼び出す必要がありますか?

ありがとうございました。

答えて

10

カスタムコールバックまたはミドルウェア機能を使用して、より多くの制御を行うことができます。例については、ガイドのAuthenticationセクションを参照してください。

例えば、カスタムコールバックは、次のようになります。また

app.get('/login', function(req,res,next) { 
    passport.authenticate('local', function(err,user) { 
      if(!user) res.send('Sorry, you\'re not logged in correctly.'); 
      if(user) res.send('Skeet skeet!'); 
    })(req,res,next); 
}); 

、あなたは常に両方の応答をリダイレクトすることができます:

app.get('/login', 
    passport.authenticate('local', { successRedirect: '/winner', 
            failureRedirect:'/loser' })); 

または単純なミドルウェアと失敗をリダイレクト:

app.get('/login', ensureAuthenticated, 
    function(req,res) { 
       // successful auth 
       // do something for-the-win 
    } 
); 

    // reusable middleware 
    function ensureAuthenticated(req,res,next) { 
     if(req.isAuthenticated()) {return next();} 
     res.redirect('/login/again'); // if failed... 
    } 
+0

ああ、カスタムコールバックのアプローチはうまくいくように見えます。ありがとう。 両方の代替ソリューションはどのように同じことをしますか? POSTリクエストで成功/失敗のリダイレクトの例を実行しませんか?それが私がatmしていることです。 もう1つの方法は、ページにアクセスするためのログインを強制する標準的な方法です。同様に、これはアクセスを制御したいページ(ユーザープロファイルなど)に置くものです。 私はあなたをカスタムコールバックの回答としてマークします。 – AntelopeSalad

+0

「認証の成功または失敗にどのように対応できますか?」という質問をしましたが、これらの3つの方法は異なる方法です。代替案では、応答を処理するためにクライアントを別のルートに送信しているだけです。実装の詳細がわからないので、最適なものを決定するのはあなた次第です。はい、オプション3は、認証が必要なページの認証を強制するのに最適な方法です。 –

17

最新のバージョンPassport、フラッシュメッセージのサポートが追加されました。これにより、あなたが求めていることを簡単に行うことができます。

エラーメッセージを含むことができるdoneに3番目の引数を指定できるようになりました。たとえば:

if (user.login.password != utility.encryptString(user.login.salt + password)) { 
    return fn(null, false, { message: 'yo, invalid login!' }); 
} 

その後、authenticate()のオプションとしてtruefailureFlashを設定します。この場合

passport.authenticate('local', { successRedirect: '/', 
           failureRedirect: '/login', 
           failureFlash: true }); 

認証が失敗した場合、メッセージは、あなたが再びログインページを表示するとき、あなたがそれをレンダリングするために準備ができて、フラッシュに設定されます。

カスタムコールバックも完全に問題ありません。組み込みのオプションは、共通のタスクを簡単に実行できるようにします。

また、私は興味があります:サンプルに問題があると言います。何が改善すべきだと思いますか?私は可能な限り良い例を作りたいと思っています。ありがとう!

(詳しくは、comment号12号を参照してください)。

+0

フラッシュが失敗するとずっと簡単になります。しかし、私は、 'done'やOPの' fn'に渡された 'err'は、その作業にnullまたはfalseでなければならないことに気付きました。 – JohnnyCoder

関連する問題