PHP中的JWT令牌:firebase/php-jwt库及完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的JWT令牌:firebase/php-jwt库完整指南



JSON Web Token (JWT) 是一种以JSON格式在客户端和服务器之间传输数据的紧凑且安全的方式。在现代Web开发中,JWT广泛用于用户身份验证和授权,以及在不同服务之间交换信息。在PHP中,最流行且可靠的JWT操作库是firebase/php-jwt。



什么是JWT,为什么需要它?

JWT由三部分组成,各部分用点号分隔:

  • Header — 头部,包含令牌类型和签名算法的信息。
  • Payload — 有效载荷,包含数据(例如用户ID、角色、过期时间)。
  • Signature — 签名,使用密钥或RSA/ECDSA密钥对生成。

JWT的主要优点:

  • 无需在服务器上存储会话(无状态)。
  • 可以包含任意JSON格式的数据。
  • 支持多种签名算法:HS256、RS256、ES256等。
  • 由于加密签名,具有防篡改能力。


安装firebase/php-jwt库

使用Composer安装该库。在项目根目录下打开终端并执行命令:

composer require firebase/php-jwt

安装后,在PHP脚本中引入Composer的自动加载:

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use Firebase\\JWT\\JWT;use Firebase\\JWT\\Key;?>


创建JWT令牌

要创建令牌,需要定义有效载荷(payload)并使用密钥对其进行签名。以下是使用HS256算法创建令牌的示例:

<?php$key = 'your-secret-key-here'; // 密钥(至少32个字符)$payload = [    'iss' => 'pythonlib.ru',       // 令牌签发者    'sub' => '1234567890',         // 主题(例如用户ID)    'name' => '伊万·伊万诺夫',    'role' => 'user',    'iat' => time(),               // 创建时间    'exp' => time() + 3600         // 过期时间(1小时)];

$jwt = JWT::encode($payload, $key, 'HS256');echo "创建的JWT令牌:" . $jwt;?>

在此示例中,我们设置了标准字段:iss(签发者)、sub(主题)、iat(创建时间)和exp(过期时间)。您可以添加任何自定义字段,例如role或email。



解码和验证JWT令牌

从客户端收到令牌后,需要验证其签名和过期时间。该库会自动检查算法和签名的有效性:

<?phptry {    $decoded = JWT::decode($jwt, new Key($key, 'HS256'));    print_r($decoded);} catch (\\Firebase\\JWT\\ExpiredException $e) {    echo "错误:令牌已过期 — " . $e->getMessage();} catch (\\Firebase\\JWT\\SignatureInvalidException $e) {    echo "错误:签名无效 — " . $e->getMessage();} catch (\\Exception $e) {    echo "错误:" . $e->getMessage();}?>

decode()方法返回一个包含payload数据的stdClass对象。如果令牌无效,则会抛出相应的异常。建议始终处理ExpiredException和SignatureInvalidException异常。



使用非对称加密(RS256)

为了提高安全性,请使用带有密钥对(私钥/公钥)的RS256算法。这在微服务架构中尤其重要:

<?php// 生成密钥(只需执行一次)// openssl genrsa -out private.pem 2048// openssl rsa -in private.pem -pubout -out public.pem

$privateKey = file_get_contents('

推荐