MySQL日期函数DATE_ADD与DATE_SUB实战指南
2026/10/23 9:08:33
composer require firebase/php-jwtpublic static function encode( array $payload, string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key, string $alg = 'HS256', string $keyId = null, array $head = null ): string参数名 | 类型 | 必选 | 说明 |
$payload | 数组 | 是 | JWT 的载荷,存储业务数据(如用户ID、过期时间),建议包含注册声明 |
$key | 字符串/加密资源等 | 是 | 加密密钥: |
$alg | 字符串 | 否 | 加密算法,默认HS256 。常用: |
$keyId | 字符串 | 否 | 密钥 ID,多密钥场景下标识当前密钥,写入 JWT 头部(kid字段) |
$head | 数组 | 否 | 自定义 JWT 头部信息,合并默认头部(含alg,typ) |
public static function decode( string $jwt, string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate|JWKSet $key, array $allowedAlgs = ['HS256'] ): stdClass参数名 | 类型 | 必选 | 说明 |
$jwt | 字符串 | 是 | 待验证的 JWT 令牌(三段式字符串,用.分隔) |
$key | 字符串/加密资源等 | 是 | 验证密钥: |
$allowedAlgs | 数组 | 否 | 允许的加密算法列表,默认['HS256'],需与生成时一致,防止算法伪造攻击 |
<?php // 1. 引入 Composer 自动加载 require_once __DIR__ . '/vendor/autoload.php'; // 2. 导入核心类和异常类 use Firebase\JWT\JWT; use Firebase\JWT\ExpiredException; use Firebase\JWT\SignatureInvalidException; use UnexpectedValueException; // 3. 配置参数 const SECRET_KEY = 'your-very-strong-secret-key-321-keep-it-safe'; const ALGORITHM = 'HS256'; // 生成 JWT 令牌 function generateJwtToken(int $userId): string { $payload = [ 'iss' => 'https://example.com', 'aud' => 'https://api.example.com', 'sub' => (string)$userId, 'iat' => time(), 'exp' => time() + 3600, 'jti' => uniqid('jwt_', true), 'username' => 'test_user', 'role' => 'admin' ]; return JWT::encode($payload, SECRET_KEY, ALGORITHM); } // 验证并解析 JWT 令牌 function verifyJwtToken(string $jwt): ?stdClass { try { $decoded = JWT::decode($jwt, SECRET_KEY, [ALGORITHM]); return $decoded; } catch (ExpiredException $e) { echo "错误:JWT 令牌已过期 - " . $e->getMessage() . PHP_EOL; } catch (SignatureInvalidException $e) { echo "错误:JWT 签名无效 - " . $e->getMessage() . PHP_EOL; } catch (UnexpectedValueException $e) { echo "错误:JWT 格式无效 - " . $e->getMessage() . PHP_EOL; } catch (Exception $e) { echo "错误:JWT 验证失败 - " . $e->getMessage() . PHP_EOL; } return null; } // 测试 $jwtToken = generateJwtToken(10086); echo "生成的 JWT 令牌:" . PHP_EOL . $jwtToken . PHP_EOL . PHP_EOL; $decodedData = verifyJwtToken($jwtToken); if ($decodedData) { echo "JWT 验证通过,解析的数据:" . PHP_EOL; echo "用户ID:" . $decodedData->sub . PHP_EOL; echo "用户名:" . $decodedData->username . PHP_EOL; echo "过期时间:" . date('Y-m-d H:i:s', $decodedData->exp) . PHP_EOL; }# 生成私钥(2048 位,无密码) openssl genrsa -out private.pem 2048 # 从私钥生成公钥 openssl rsa -in private.pem -pubout -out public.pem<?php require_once __DIR__ . '/vendor/autoload.php'; use Firebase\JWT\JWT; use Firebase\JWT\ExpiredException; use Firebase\JWT\SignatureInvalidException; use UnexpectedValueException; const PRIVATE_KEY_PATH = __DIR__ . '/private.pem'; const PUBLIC_KEY_PATH = __DIR__ . '/public.pem'; const ALGORITHM = 'RS256'; $privateKey = file_get_contents(PRIVATE_KEY_PATH); $publicKey = file_get_contents(PUBLIC_KEY_PATH); // 私钥生成 JWT function generateRsaJwtToken(int $userId, string $privateKey): string { $payload = [ 'iss' => 'https://example.com', 'sub' => (string)$userId, 'iat' => time(), 'exp' => time() + 3600, 'username' => 'test_user_rsa' ]; return JWT::encode($payload, $privateKey, ALGORITHM); } // 公钥验证 JWT function verifyRsaJwtToken(string $jwt, string $publicKey): ?stdClass { try { $decoded = JWT::decode($jwt, $publicKey, [ALGORITHM]); return $decoded; } catch (ExpiredException $e) { echo "错误:JWT 令牌已过期 - " . $e->getMessage() . PHP_EOL; } catch (SignatureInvalidException $e) { echo "错误:JWT 签名无效 - " . $e->getMessage() . PHP_EOL; } catch (UnexpectedValueException $e) { echo "错误:JWT 格式无效 - " . $e->getMessage() . PHP_EOL; } catch (Exception $e) { echo "错误:JWT 验证失败 - " . $e->getMessage() . PHP_EOL; } return null; } // 测试 $jwtToken = generateRsaJwtToken(10087, $privateKey); echo "生成的 RSA JWT 令牌:" . PHP_EOL . $jwtToken . PHP_EOL . PHP_EOL; $decodedData = verifyRsaJwtToken($jwtToken, $publicKey); if ($decodedData) { echo "RSA JWT 验证通过,解析的数据:" . PHP_EOL; echo "用户ID:" . $decodedData->sub . PHP_EOL; echo "用户名:" . $decodedData->username . PHP_EOL; }