php - PHP JWT:: **解码** 过期令牌
问题描述
我使用了一个 JWT(Json Web 令牌),它在有效负载中有一个刷新令牌(GUID)。一般来说,我使用 Firebase JWT 来创建/编码和解码 JWT。
我想在 PHP 中解码过期的 JWT,然后使用其有效负载中的刷新令牌创建一个新的 JWT(只要刷新令牌仍然有效)。如果我使用 Firebase 解码 JWT,它会引发异常(过期)并且不会返回解码后的令牌。
如何安全地解码过期的 JWT 并访问其有效负载?我可以捕获过期的异常还是不安全,它也可能捕获其他错误。如果我这样做了,我如何访问有效载荷?感谢您的帮助和投入。
解决方案
这是我的解决方案:
- 尝试使用 Firebase 解码进行捕捉
- 捕获过期令牌的异常
- 在此捕获中,使用 base64 解码令牌以获取刷新令牌
仅当令牌有效且已过期时,它才会使用正常的 base64 解码(因此不检查签名)。但是签名检查是在步骤 1 中的解码之前完成的。
这里是它的伪代码:
$jwt = getBearerToken();
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
$refresh_token=$decoded->data->refresh_token;
}
catch (Exception $e){
if($e->getMessage() == "Expired token"){
list($header, $payload, $signature) = explode(".", $jwt);
$payload = json_decode(base64_decode($payload));
$refresh_token = $payload->data->refresh_token;
} else {
// set response code
http_response_code(401);
// show error message
echo json_encode(array(
"message" => "Access denied.",
"error" => $e->getMessage()
));
die();
}
}
推荐阅读
- excel - 使用 vba 单击网页上的按钮
- python - Pandas 过滤最大范围
- java - 在 Java/Linux 应用程序中启动数千个定时器
- wordpress - 如何更改 MapBox 弹出窗口的位置?
- c# - 如何在 Xamarin.Forms 中显示来自设备存储的图像?
- javascript - 如何在不重新启动页面的情况下将值传递给模式?
- javascript - React-Native-Maps:设置地图边界功能不准确
- unity3d - 带输入的 Drop In Drop Out 系统?
- android - 子项目模块无法解析它自己的依赖
- javascript - jsp中的Json Hash映射视图