2016-04-17 15 views
0

[Q1] HTTPインターセプタは、config.headers ["Authorization"](フロントエンドAngularJS)を変更して、要求を確認してトークンの値を格納する際のメリットreq.cookiesオブジェクト? (バックエンドNodeJS)平均:

JSON Webトークンの機能を理解しようとしています。私がセットアップしたデモアプリケーションには、ログイン機能があります。

  1. GET '/ login'では、トークンを生成できます。そのトークンでクッキーを設定できます。
  2. フロントエンドでは、トークンを含むJSONオブジェクトにアクセスできます。
  3. 開発者コンソールでCookieを表示できます。

Nodejs:

index.js - ログイン経路

router.post('/login', function(req, res, next) { 
    Authenticator.find(req.cookies.token, req.body, Heartbeat.common, function(err, warning, data){ 
    if(err) { 
     res.status(404).send({token:false, warning: null, error:err}); 
    } else if(warning){ 
     res.status(200).send({token:true, warning: warning, error:null}); 
    } else { 
     res.cookie('token', data, {maxAge: 3600000, httpOnly:true}); 
     res.status(200).json({token:true, error: null}); 
    } 
    }); 
}); 

Authenticator.ctrl.js - Authenticator.find()

find: function(token, user, heartbeat, callback) { 
    if(!token) { 
    Auth.findOne({email:user.email}, function(err, data){ 
     if(err) { 
     console.log(err); 
     } else { 
     if(data) { 
      if(data.checkHash(user.password)) { 
      callback(null, null,TokenMaker.createToken(user.email, heartbeat)); 
      } else { 
      callback(Errors.login.strict.MISMATCH, null, null); 
      } 
     } else { 
      callback(Errors.login.strict.NOT_REGISTERED, null, null); 
     } 
     } 
    }); 
    } else { 
    callback(null, Errors.login.warning.ACTIVE_REFRESH, null); 
    } 
}, 

角度コントローラ

app.controller('userAccessCtrl', ['$scope', '$http', function ($scope, $http){ 
    $scope.user = { 
    email: "[email protected]", 
    password: "12345679" 
    }; 
    $scope.error = {}; 
    $scope.loginAccess = function(user) { 
    var submitReady = true; 
    var emailStatus = EmailValidator.email(user.email); 
    var passwordStatus = EmailValidator.password(user.password); 
    if(typeof emailStatus === "string") { 
     $scope.error.email = emailStatus; 
     submitReady = false; 
    } 
    if(typeof passwordStatus === "string") { 
     $scope.error.password = passwordStatus; 
     submitReady = false; 
    } 
    if(submitReady) { 
     $scope.error = {} 
     var data = $scope.user; 
     $scope.user = {}; 
     $http.post('/login', data) 
     .then(function(success){ 
      console.log(success); 
      },function(error){ 
      console.log(error); 
     }); 
    } 

} 
}]); 

コンソールの応答:

{ 
    "data": { 
    "token":true, 
    "error":null 
    }, 
    "status":200, 
    "config":{ 
    "method":"POST", 
    "transformRequest":[null], 
    "transformResponse":[null], 
    "url":"/login", 
    "data":{ 
     "email":"[email protected]", 
     "password":"12345679" 
    }, 
    "headers":{ 
     "Accept":"application/json, text/plain, */*", 
     "Content-Type":"application/json;charset=utf-8" 
    } 
    }, 
    "statusText":"OK" 
} 
+0

インターセプタのコードはどうですか?また、通常、クッキーの代わりにローカルとセッションのストレージを使用する人がいます。理想的には、バックエンドへの認証コールが成功した後にトークンを格納し、インターセプタはそれから値を取り出し、すべての要求に対してヘッダーを作成します。クッキーとストレージの使用方法は、トークンの設定方法、有効期限などが含まれます。違いを読んでください。 – Vaelyr

+0

@Vaelyr私はこのような質問[リンク](http://stackoverflow.com/questions/3220660/local-storage-vs-cookies)を参照しました。私はクッキーとトークンの有効期限を設定しています。すべての連続したリクエストにクッキーのトークンが含まれている(JWTを保存してもサーバーに負担をかけない場合) –

+0

2番目の質問を理解しているように、あなたはそうではないと思いますクッキーを稼働させることができますか?どのソリューションを選択しても、ヘッダまたはクッキーのどちらかを使って検証するために、バックエンドに渡す必要があります。ステートレスな機構なので、負担のあるサーバの反対側にあります。セッションはありません。ヘッダーを作成するコードを表示できますか? – Vaelyr

答えて

1

は、実際には、クッキーとJWTトークンを使用して間違っているのです。 JWTトークンは、Cookieよりも認証に優れています。 トークンを使用する場合、サーバーはメモリのデータベースにセッションを保存する必要はありません。これはアプリケーションにとって大きな利点です。サーバー間でセッションを同期する方法を考えずにアプリケーションを拡張し、新しいサーバーを追加できます。短い言葉で

、あなたはJWTを使用するときに、あなたの流れは次のトークンは:(あなたはそれが角度のケースで)

  • フロントエンドは、ログインとパスワードに/ログインルート
  • バックエンドのチェックの資格情報を送信し、返信トークン(リクエストボディではなく、クッキー中)
  • フロントエンドアプリはブラウザ
  • のローカルストレージやセッションストレージにトークンを保存し、あなたは、バックエンドにすべての要求をインターセプトし、それが「認可」ヒードを添付しますどのHTTPのInterceptorを書くことができますすべての要求にR、それは次のようになります。

    認証:ベアラがここ-ある-あなた-JWT-トークン

  • バックエンドは、この認証ヘッダーをチェックし、それが正しいかどうか(どのように検証を読み取るためにhttp://jwt.ioを見ることができます作品)バックエンドはあなたの要求に応えることができます。

+0

「実際には、クッキーとJWTトークンを使用するのは間違いです.JWTトークンは、クッキーよりも認証に優れています。なぜそれを詳しく説明できますか?私はXSS攻撃とCSRF攻撃について読んだことがあり、クッキーにトークンを格納することは、httpOnlyをtrueにしてjsによってクッキーにアクセスできないようにすることで安全であると言います。 –

+1

トークンは、モバイル、デスクトップ、またはウェブサイトアプリケーション用のAPIを提供するサーバーがある場合、APIで頻繁に使用されます。トークンの主な利点はステートレスなことです。つまり、サーバーはメモリー、Redis、データベース、ファイルなどのトークンを格納する必要はなく、サーバーはJWTトークンを生成してアプリケーションに戻します。これにより、アプリケーションの規模を単純化できます。アプリケーションが大量にロードされている場合、ユーザーはバックエンドに対して多くの要求を行い、すべての要求に対するユーザーのセッションの検証にJWTトークンの検証よりも時間がかかります。 –

+1

もちろん、HTTPonlyフラグを持つセッションクッキーはより安全で実装が簡単ですが、バックエンドが異なるホストからの要求を処理する必要がある場合(モバイルアプリケーションやデスクトップアプリケーションを作成する場合)、JWTトークンを使用する方が良いでしょうもうセッションを使用する –