过期的 JWT 令牌 - 如何刷新令牌
Expired JWT Token - How to refresh 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]);
}
我将此服务器与 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
:表示token可以刷新多少次
refreshCount
:表示token被刷新了多少次
因此只有满足以下条件时才刷新令牌:
- 令牌未过期(
exp >= now
)。
- 令牌已刷新次数小于令牌可刷新次数(
refreshCount < refreshLimit
)。
刷新令牌时:
- 更新到期日期 (
exp = now + some-amount-of-time
)。
- 增加令牌刷新次数(
refreshCount++
)。
一旦令牌被签名并在服务器端验证签名,令牌的内容就不能被客户端篡改。
我正在开发一个移动应用程序,我意识到我的令牌有期限。我正在使用 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]);
}
我将此服务器与 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
:表示token可以刷新多少次refreshCount
:表示token被刷新了多少次
因此只有满足以下条件时才刷新令牌:
- 令牌未过期(
exp >= now
)。 - 令牌已刷新次数小于令牌可刷新次数(
refreshCount < refreshLimit
)。
刷新令牌时:
- 更新到期日期 (
exp = now + some-amount-of-time
)。 - 增加令牌刷新次数(
refreshCount++
)。
一旦令牌被签名并在服务器端验证签名,令牌的内容就不能被客户端篡改。