📜  如何在 php 中解码 jwt 令牌(1)

📅  最后修改于: 2023-12-03 15:08:44.350000             🧑  作者: Mango

如何在 PHP 中解码 JWT 令牌

JWT(JSON Web Token)是一种轻量级的身份验证和授权机制,由于其简单易懂,被广泛应用于跨域身份验证、REST API 的保护等场景。

本文将介绍如何在 PHP 中解码 JWT 令牌,以便于使用 JWT 实现身份验证和授权。

JWT 令牌结构

JWT 令牌由三部分组成,分别是头部(header)、载荷(payload)和签名(signature)。这些部分以.分隔,且都是经过 Base64 编码的字符串。

头部通常包含算法和令牌类型,示例:

{
  "alg": "HS256",
  "typ": "JWT"
}

载荷通常包含用户的身份信息、权限等信息,示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

签名使用头部中指定的算法,对头部和载荷进行签名,以保证令牌的完整性和真实性。

解码 JWT 令牌

解码 JWT 令牌通常需要以下步骤:

  1. 将 JWT 令牌分隔为头部、载荷和签名。
  2. 计算签名并与传入的签名进行比对,以保证 JWT 令牌的完整性和真实性。
  3. 解码头部和载荷。

以下是在 PHP 中实现解码 JWT 令牌的示例代码:

<?php

function decodeJwt($jwt, $secret_key) {
    // 分隔 JWT 令牌为头部、载荷和签名
    list($header_base64, $payload_base64, $signature) = explode('.', $jwt);
    
    // 计算签名
    $computed_signature = hash_hmac('sha256', "$header_base64.$payload_base64", $secret_key, true);
    
    // 比对签名
    if (base64_decode($signature) !== $computed_signature) {
        return false;
    }
    
    // 解码头部和载荷
    $header = json_decode(base64_decode($header_base64), true);
    $payload = json_decode(base64_decode($payload_base64), true);
    
    return ['header' => $header, 'payload' => $payload];
}

?>

该方法接受两个参数:

  1. $jwt,即 JWT 令牌。
  2. $secret_key,即用于签名的密钥。

调用该方法即可解码 JWT 令牌并返回头部和载荷。

总结

本文介绍了如何在 PHP 中解码 JWT 令牌,包括了 JWT 令牌的结构和解码的步骤,并提供了示例代码供参考。在使用 JWT 实现身份验证和授权时,可按照本文所述进行解码操作。