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



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

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

当我测试功能刷新令牌时,单击一个按钮,它可以刷新令牌。

我想知道我如何自动刷新我的令牌,以便用户不必每次断开连接,因为它相当限制性^^我应该每次检查我的令牌吗?我应该为申请提供几个条件以每次找到这个问题吗?

您应该接受有效(和非预期(令牌进行茶点。假设客户在 exp索赔中指示的到期日期之前刷新令牌是刷新令牌的责任。

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


为了避免无限期地刷新令牌,例如,您可以通过向您的令牌添加两个主张来保持令牌刷新的跟踪(索赔名称取决于您(:

  • refreshLimit:指示可以刷新令牌的次数。
  • refreshCount:指示已刷新令牌的次数。

因此,只有以下条件为真,只有刷新令牌:

  • 令牌未过期(exp >= now(。
  • 刷新令牌的次数少于刷新令牌的次数(refreshCount < refreshLimit(。

刷新令牌时:

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

签署令牌并在服务器端验证签名后,客户端的内容无法被客户端篡改。

最新更新