php jwt 实现
PHP JWT 实现
安装依赖
使用 Composer 安装 firebase/php-jwt 库,该库提供了 JWT 的编码和解码功能。
composer require firebase/php-jwt
生成 JWT Token
生成 JWT Token 需要指定密钥、有效载荷(Payload)和算法。密钥用于签名,有效载荷包含用户数据或其他信息,算法通常为 HS256。
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$key = 'your-secret-key'; // 替换为实际密钥
$payload = [
'iss' => 'your-issuer', // 签发者
'aud' => 'your-audience', // 接收方
'iat' => time(), // 签发时间
'exp' => time() + 3600, // 过期时间(1小时后)
'data' => [ // 自定义数据
'user_id' => 123,
'username' => 'example_user'
]
];
$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
验证 JWT Token
验证 Token 时需检查签名是否有效,并解析有效载荷。如果 Token 过期或签名无效,会抛出异常。

try {
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
print_r($decoded);
} catch (Exception $e) {
echo 'Token 验证失败: ' . $e->getMessage();
}
自定义异常处理
在实际应用中,可以捕获特定异常(如过期或签名无效)并返回适当的 HTTP 响应。
try {
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
// 业务逻辑
} catch (Firebase\JWT\ExpiredException $e) {
http_response_code(401);
echo json_encode(['error' => 'Token 已过期']);
} catch (Firebase\JWT\SignatureInvalidException $e) {
http_response_code(401);
echo json_encode(['error' => 'Token 签名无效']);
} catch (Exception $e) {
http_response_code(400);
echo json_encode(['error' => 'Token 无效']);
}
密钥管理
密钥应存储在安全的地方(如环境变量或配置文件中),避免硬编码在代码中。可以使用 .env 文件管理密钥。

# .env 文件示例
JWT_SECRET=your-secret-key
通过 vlucas/phpdotenv 加载环境变量:
composer require vlucas/phpdotenv
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$key = $_ENV['JWT_SECRET'];
刷新 Token
如果应用需要刷新 Token,可以在 Token 即将过期时生成新的 Token 并返回给客户端。
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
if ($decoded->exp - time() < 300) { // 剩余时间少于5分钟
$newPayload = (array)$decoded;
$newPayload['iat'] = time();
$newPayload['exp'] = time() + 3600;
$newJwt = JWT::encode($newPayload, $key, 'HS256');
echo json_encode(['token' => $newJwt]);
}
通过以上步骤,可以在 PHP 中实现 JWT 的生成、验证和管理。






