PHP JWT:: **解码** 过期令牌

Posted

技术标签:

【中文标题】PHP JWT:: **解码** 过期令牌【英文标题】:PHP JWT:: **Decode** expired Token 【发布时间】:2020-07-25 12:06:32 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

这是我的解决方案:

    使用 Firebase 解码尝试并捕获 捕获过期令牌的异常 在此 catch 中,使用 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();
    

【讨论】:

以上是关于PHP JWT:: **解码** 过期令牌的主要内容,如果未能解决你的问题,请参考以下文章

PHP Slim 解码 JWT 令牌

使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误

如何验证nodejs中的jwt令牌/永不过期?

如果生成了新的 JWT,如何使 JWT 过期

如何手动使 JWT 令牌过期?

JWT 令牌解码