2017-04-23 169 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索賠中指出的到期日期之前刷新令牌是客戶的責任。

您可以調用該函數來定期刷新令牌,而該頁面中的使用是活動的。


爲了避免令牌被無限期地刷新,你可以,例如,保持令牌茶點的軌道通過添加兩個聲稱您的令牌(索賠名字是由你):

  • refreshLimit:表示令牌可刷新的次數。
  • refreshCount:表示令牌刷新了多少次。

如果滿足下列條件爲真因此,只有刷新令牌:

  • 令牌沒有過期(exp >= now)。
  • 令牌刷新次數少於令牌刷新次數(refreshCount < refreshLimit)。

並刷新令牌時:

  • 更新到期日(exp = now + some-amount-of-time)。
  • 遞增令牌刷新次數(refreshCount++)。

一旦令牌被簽名並且簽名在服務器端被驗證,令牌的內容就不會被客戶端篡改。

+1

除了'refreshCount'之外,還可以引入絕對過期時間,這也是限制刷新次數的自定義屬性。 – zerkms

+1

這是另一個有效的方法:) –

+1

是的,它們確實是一樣的:-)我也看到人們發佈了一個單獨的長生存刷新令牌,用於發佈短期存在的JWT。在某些情況下,它可能更方便。 – zerkms