首页 > 解决方案 > PHP JWT:: **解码** 过期令牌

问题描述

我使用了一个 JWT(Json Web 令牌),它在有效负载中有一个刷新令牌(GUID)。一般来说,我使用 Firebase JWT 来创建/编码和解码 JWT。

我想在 PHP 中解码过期的 JWT,然后使用其有效负载中的刷新令牌创建一个新的 JWT(只要刷新令牌仍然有效)。如果我使用 Firebase 解码 JWT,它会引发异常(过期)并且不会返回解码后的令牌。

如何安全地解码过期的 JWT 并访问其有效负载?我可以捕获过期的异常还是不安全,它也可能捕获其他错误。如果我这样做了,我如何访问有效载荷?感谢您的帮助和投入。

标签: phpjwt

解决方案


这是我的解决方案:

  1. 尝试使用 Firebase 解码进行捕捉
  2. 捕获过期令牌的异常
  3. 在此捕获中,使用 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();
    }
}

推荐阅读