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

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

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

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

【问题讨论】:

    标签: php jwt


    【解决方案1】:

    这是我的解决方案:

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

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 2020-12-01
      • 2021-12-30
      • 2018-10-05
      • 2019-05-19
      • 2017-03-04
      • 2019-07-04
      • 2017-01-22
      • 2020-05-23
      相关资源
      最近更新 更多