2017-04-23 16 views
1

私はモバイルアプリケーションを開発していますが、トークンの期間が限られていることがわかりました。私は私がトークンリフレッシュする機能を持っているsymfonyのサーバを、使用しています:期限切れのJWTトークン - トークンをリフレッシュする方法

/** 
* @Route("/api/refresh", name="api_refresh") 
*/ 
public function refreshTokenAction(Request $request) 
{ 
    if(!$request->headers->has('Authorization')) { 
     return; 
    } 

    $extractor = new AuthorizationHeaderTokenExtractor(
     'Bearer', 
     'Authorization' 
    ); 

    $token = $extractor->extract($request); 

    $encoder = $this->get('lexik_jwt_authentication.encoder'); 

    $data = $encoder->decode($token); 

    if(!$data){ 
     return; 
    } 

    $username = $data['mail']; 

    $user = $this->getDoctrine()->getRepository('AppBundle:Benevole') 
     ->findOneBy(['mail' => $username]); 

    $token = $this->get('lexik_jwt_authentication.encoder') 
     ->encode(['mail' => $user->getMail()]); 

    // Return genereted tocken 
    return new JsonResponse(['token' => $token]); 

} 

私はこのように自分のサーバーを呼び出しているAngularJSでアプリケーションと、このサーバーを使用します。

var refreshToken = function(idPatient){ 
    var token = window.localStorage.getItem('token'); // current valid token 
    return $http({ 
      method : 'GET', 
      url  : url + '/refresh', 
      headers : {Authorization : 'Bearer ' + token}, 
     }).then(function(result) { 
     console.log(result.data); 
     return result.data; 
    }); 
}; 

私は私の機能のリフレッシュトークンをテストすると、ボタンをクリックすると動作し、トークンがリフレッシュされます。

私は自分のトークンをどのように更新することができるのかを知りたいので、毎回トークンをチェックする必要がありますか?毎回これを見つけるアプリケーションにいくつかの条件を付ける必要がありますか?

答えて

4

(有効期限切れではない)トークンのみを受け入れてください。クライアントがexpのクレームに示された有効期限前にトークンをリフレッシュするのはクライアントの責任であると仮定してください。

トークンを定期的にリフレッシュするには、そのページでの使用がアクティブな間に関数を呼び出すことができます。


無期限にリフレッシュされてからトークンを避けるために、あなたは、例えば、(請求名はあなた次第です)自分のトークンに2件のクレームを追加することにより、トークンリフレッシュを追跡することができます:

  • refreshLimit:トークンをリフレッシュできる回数を示します。
  • refreshCount:トークンがリフレッシュされた回数を示します。

次の条件に該当する場合にだけそうトークンを更新:

  • トークンは(exp >= now)有効期限が切れていません。
  • トークンがリフレッシュされた回数は、トークンをリフレッシュできる回数(refreshCount < refreshLimit)よりも少なくなっています。

とトークンをリフレッシュ:

  • は、有効期限(exp = now + some-amount-of-time)を更新します。
  • トークンがリフレッシュされた回数を増やします(refreshCount++)。

トークンに署名してサーバー側で署名が検証されると、トークンの内容をクライアントが改ざんすることはできません。

+1

refreshCountの代わりに、リフレッシュ回数を制限するカスタムプロパティである絶対有効期限を導入することもできます。 – zerkms

+1

それは別の有効なアプローチです:) –

+1

彼らはまったく同じです:-)私はまた、人々が短い生活JWTを発行するために使用される別の長いリビングリフレッシュトークンを発行するのを見ました。場合によっては、より便利かもしれません。 – zerkms

関連する問題