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('