过期的 JWT 令牌 - 如何刷新令牌

Ale*_*aig 3 symfony jwt angularjs json-web-token

我正在开发一个移动应用程序,并且我意识到我的令牌的持续时间是有限的。我正在使用 Symfony 服务器,它具有刷新令牌的功能:

/**
 * @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]);

}
Run Code Online (Sandbox Code Playgroud)

我将此服务器与 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;
    });
};
Run Code Online (Sandbox Code Playgroud)

当我测试我的函数刷新令牌时,单击一个按钮,它起作用了,令牌被刷新。

我想知道如何自动刷新我的令牌,这样用户就不必每次都断开连接,因为它是相当严格的 ^^ 我应该每次都检查我的令牌吗?我是否应该为应用程序设置几个条件,以便每次都能找到它?

cas*_*lin 5

您应该接受有效(和未过期)的令牌进行刷新。假设客户有责任在exp声明中指示的到期日期之前刷新令牌。

您可以调用该函数定期刷新令牌,同时在页面中使用处于活动状态。


为避免令牌无限期刷新,例如,您可以通过向令牌添加两个声明来跟踪令牌刷新(声明名称由您决定):

  • refreshLimit:表示令牌可以刷新多少次。
  • refreshCount:表示token被刷新了多少次。

因此,仅当满足以下条件时才刷新令牌:

  • 令牌未过期 ( exp >= now)。
  • 令牌被刷新的次数小于令牌可以被刷新的次数(refreshCount < refreshLimit)。

当刷新令牌时:

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

一旦令牌被签名并在服务器端验证签名,令牌的内容就不能被客户端篡改。