2013-11-26 9 views
81

成功した認証でパスポート - ローカルを組み合わせてJWTトークンを返すにはどうすればよいですか?passport-local with node-jwt-simple

私はnode-jwt-simpleを使用したいとpassport.jsを見て私は約行く方法がわからないです。

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

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.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

done()を呼び出したときにトークンを返すことはできますか?このような 何か...(ちょうど擬似コード)

if(User.validCredentials(username, password)) { 
    var token = jwt.encode({username: username}, tokenSecret); 
    done(null, {token : token}); //is this possible? 
} 

ない場合、どのように私はトークンを返すことができますか?

答えて

116

私はそれを理解しました!

あなたは正しい戦略を実施する必要がまず第一。私の場合、LocalStrategyでは、検証ロジックを提供する必要があります。たとえば、passport-localのものを使ってみましょう。

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

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.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

パスワードが一致した(質問の範囲と私の答えを超えた)

passport.jsはそれのためのいくつかの部分を期待していた場合function(username, password, done)は、ユーザーを見つけ、チェックの世話をします提供コールバック検証動かすためには、戦略のユーザーを返すことです。私はコードのその部分を変更しようとしていた、それは間違っていた。検証が失敗した場合はfalse、成功した場合はobject(検証済みのユーザー)がコールバックに必要です。

今.... JWTを統合する方法?ログインルートで

あなたは成功した認証または失敗したものを処理する必要があります。 JWTトークンの作成を追加する必要があります。同様に:

(セッションを無効にすることを忘れないでください。そうしないと、シリアライズとデシリアライズ機能を実装する必要があります。セッションを維持していない場合は必要ありません。トークンベース認証)パスポート、現地の例から

:(JWTトークンとは)

// POST /login 
// This is an alternative implementation that uses a custom callback to 
// achieve the same functionality. 
app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { 
     return res.json(401, { error: 'message' }); 
    } 

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret); 
    res.json({ token : token }); 

    })(req, res, next); 
}); 

を追加し、それはそれです!ここで/ loginとPOSTのユーザー名とパスワード(常にSSL経由でなければなりません)を呼び出すと、上の最初のコードスニペットは、指定したユーザー名に基づいてユーザーを見つけようとし、パスワードが一致することを確認しますあなたのニーズに合うように変更してください)。ログインルートが呼び出され、そこにあなたがエラーまたは有効なトークンを返すの世話をすることができます。その後

これは誰かを助けることを願っています。私が何か間違いや忘れてしまったことがあれば、私に知らせてください。

+2

クール、おかげでそれを送り返すために、角度使用して、クライアントサイドでトークンを処理する方法を学ぶために素晴らしいですそれは: – robertklep

+3

Passportの[BasicStrategy](http://passportjs.org/guide/basic-digest/)またはDigestStrategyが他に2つあります。しかし、BasicとLocalの戦略には大きな違いはないようですが、どちらのセッションも動作する必要はありません.LocalはリダイレクトURLを要求します(APIにやさしい)。 – funseiki

+1

ちょっと@cgiacomiトークンをチェックするルートの例を挙げることができますか? –

3

ここで私は、具体的にのみAPIトークン(なしのセッションを使用するために働いているボイラープレートです...そのセッションはもちろん悪いことではありません。ちょうど私たちが)トークンのアプローチを使用している: https://github.com/roblevintennis/passport-api-tokens

18

は、これは素晴らしいソリューションですが、私はちょうどこれを追加する:

var expressJwt = require('express-jwt'); 

app.use('/api', expressJwt({secret: secret})); 

私は「表現・JWTを」をトークンを検証するためにを使用したいです。

ところで:この記事では、解決方法を投稿するためのすべてのリクエストに

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

+2

私は 'express-jwt'を使って認証を行いましたが、 'passport-jwt'、私は' express-jwt'に固執すると思います。はるかに簡単で、はるかに良いIMO – bobbyz

+0

FYI express-jwtはリフレッシュトークンをサポートしていません。 – user3344977