2017-02-06 18 views
3

私はjson Webトークンを使用してノードアプリケーションを持っています:json webトークンはどこにデータを保存しますか?

var jwt = require( 'jsonwebtoken');

ログインsuccedes場合、このライブラリは、このようにトークンを作成します。トークンがサーバー上に格納されている場所、私は理解していない何

var payload = {mydata: 'abcd'}; 
var token = jwt.sign(payload, 'secret', { 
    expiresIn: 28800 
}); 

return { 
    success: true, 
    message: 'Success', 
    token: token 
}; 

です。 トークンを受けた同じユーザーが、私はこの行を持って、保護されたリソースへの呼び出しを行った場合:

jwt.verify(token_sent_by_used, 'secret', function (err, res) { 
    if(!err){ 
     res.json({result: 'success'}); 
    } 
    else{ 
     res.json({result: 'failure'}); 
    } 
} 

イムがこれを求めている理由は、実行しているとき、私はJWTを扱う方法についての説明を見つけることができなかったということです複数のマシンにまたがるアプリケーション。 私のバックエンドが別のマシンに置かれ、ユーザーがロードバランサに要求を行うと、その要求はどのマシンにも当てられます。 jwtがファイルシステムにトークンデータを書き込む場合、要求がトークンを作成したマシンでないマシンにヒットした場合、問題が発生する可能性があります。 セッションを使用する場合は、セッションハンドラをデータベースに設定できます。あなたはjwtでこれをどのように解決しますか?

**** **** EDIT

[OK]を、のはeaxmpleてみましょう。 マシン10で動作しているノードアプリケーションとマシン11で動作しているノードアプリケーションが同じです。 2つの異なるマシン。

私はマシン10に行き、ユーザー名パスワードを送信します。マシン.10のアプリケーションはユーザー名/パスワードをチェックします。オッケー。 Machine .10はjwtトークンを作成して私に送ります。

これで、.11を処理するための(有効なjwtトークンを必要とするリソースへの)カール要求を行い、貴重に送られたjwtトークンを貴方に送ってきました。 Machine .11はjtw-tokenについて不平を言いませんか?それは有効と考えられますか?マシン11で作成されていない場合でも、

+1

Jwtトークンはサーバーに格納されません。 jwtトークンサーバーを作成した後、そのトークンをユーザー/ブラウザーに送信します。そのトークンは、アプリ状態、ブラウザのローカルストレージまたはブラウザのセッションストレージのいずれかに保存できます。 –

+0

編集した質問をご覧ください。 – oderfla

+1

Jwtトークンはマシンとは関係ありません。トークンの復号化/暗号化には、両方のマシンで同じ秘密鍵が必要です。 –

答えて

3

質問の両方のサーバーがトークンを確認できる必要があります。署名を生成できる必要があります。両方のサーバが同じ秘密鍵(.10でトークンの署名を最初に生成するために使用される)を共有する場合、両方のサーバはその内容を確認することができます。

下のスクリーンショットでは、赤い部分と紫色の部分の両方が平文です - 誰でもその部分を読んで変更できます。しかし、青色の部分は特殊です - それはサーバー上でのみ生成することができます赤と紫の部分秘密鍵を使用します。したがって、赤と紫の部分が改ざんされていないことが保証されます。あなたは、サーバーに戻す全体JTWを送信するとき

enter image description here

そう、それは青い部分を生成し、あなたが送っている青い部分とそれを比較するために、秘密鍵を使用することができます。一致しない場合、誰か(不当に)赤色または紫色の部分が変更され、認証が拒否されます。

2

JWTはサーバーに格納されません。

サーバーがJWTを渡すと、クライアントに訪問者のパスが与えられ、リソースを要求するたびに使用できます。クライアントがそれを保持し、それが有効である(すなわち期限切れでない)限り、それは要求と共にサーバにそれを示すことができ、それに応じてサーバが応答する。

サーバーは、それが秘密で署名したので、有効なパスであることを知っています。

複数のマシンで実行する場合、トークンを確認する必要があるサーバーがあれば、その秘密を知ることができます。

編集

上記を明確にするあなたは、マシンAがトークンを受け入れるための唯一の要件は非常に署名を検証しているマシンBで

を発行されたトークンを受け入れるかどうか、特に求めていますどこから来たのか確認することができます。

マシンAとマシンBがシークレットを共有する場合、それらのトークンは交換可能です。 2つの点で違いはなく、マシンAはトークンを発行したかどうか、またはマシンBがトークンを発行したかどうかを知ることができません。

+0

編集した質問をご覧ください。 – oderfla

+1

私は最後の行を少し明確にしました。マシン.10と.11が同じキーを持つ場合、それらのトークンは交換可能です – JamesT

1

トークンはサーバーに保存されません。 documentationあなたは読むことができます

認証:これはJWTを使用するための最も一般的なシナリオです。ユーザーがログインすると、その後の各要求にJWTが含まれ、ユーザーはそのトークンで許可されているルート、サービス、およびリソースにアクセスできます。あなたが理解する必要が

  • を使用すると、ログイン要求を受信すると(要求が有効である場合)、ユーザーにトークンを返す
  • リクエストごとに、クライアントはあなたをお送りしますトークンを戻すと、このトークンが送信したものと一致するかどうかを確認することができます。あなたが確認するために、次にreq.headers[<token_property_here>]

を使用してアクセスすることができますサーバー側のように、ほとんどの時間、トークンは、リクエストヘッダで提供されます、あなたはコード

のこの種を実行する必要があります
jwt.verify(req.headers['x-auth-token'], 'secret', function (err, res) { 
    if(err){ 
     return res.json({result: 'failure'}); 
    } 
    // Else do something else 
} 
1

jwtを使用すると、クライアントにトークンを保存できます。通常、localStorageまたはsessionStorageでは、承認ヘッダーでリクエストを行うたびにトークンを送信します。
stormpathのように、httpOnlyと安全なフラグ(説明を読む)でクッキーにjwtを保存します。
したがって、ユーザーがリソースにアクセスする必要があるたびに、Cookieを確認する必要があります。

res.cookie('token', jwt, { httpOnly: true, secure: true }); 

は、その後、あなたが認証を確認するミドルウェアを作成することができます。Expressでは
は、あなたがしてクッキーに保存JWTを作成するとき。

const UserAuthenticated = (req, res, next) => { 

     const token = req.cookies.token; //if cookie not exist, user is not authenticated (httpOnly flag)  

     jwt.verify(token_sent_by_used, 'secret', function (err, res) { 
       if (!err) { 
        req.token = res.validToken; 
        next(); 
       } else { 
        res.send('Not authenticated'); 
       } 
     }); 
}; 

//In your endpoint you use like:<br/> 
router.get('/someEndPoint', userAuthenticated, (req, res) => { 
     // use the token here. 
     const token = req.token; 
    ... 
}); 

次に、クライアント上の要求を行う際に、ブラウザがクッキーを送信できるようになりますwithCredentialsを追加することを忘れないでください。

superagent.post(url) 
    .withCredentials()    
    .send(_msg); 

これですべてが必要です。

関連する問題