php jwt 实现

PHP JWT 实现方法
安装依赖库
使用 Composer 安装 firebase/php-jwt 库,这是目前 PHP 中最流行的 JWT 实现方案。在项目根目录执行以下命令:
composer require firebase/php-jwt
生成 JWT Token
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' => [ // 自定义数据
'userId' => 123,
'username' => 'example'
]
];
$jwt = JWT::encode($payload, $key, 'HS256');
验证 JWT Token
try {
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
$decodedArray = (array)$decoded;
print_r($decodedArray);
} catch (Exception $e) {
echo '验证失败: ', $e->getMessage();
}
自定义算法支持
如果需要使用 RS256 等非对称加密算法:
// 生成 RSA 密钥对
$privateKey = openssl_pkey_new([
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA
]);
// 使用 RS256 算法签发
$jwt = JWT::encode($payload, $privateKey, 'RS256');
// 使用公钥验证
$publicKey = openssl_pkey_get_details($privateKey)['key'];
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
常见配置选项
- 设置令牌过期时间:
'exp' => time() + 7200(2小时) - 添加生效时间:
'nbf' => time() + 300(5分钟后生效) - 添加唯一标识:
'jti' => uniqid()
安全注意事项
- 密钥长度至少 32 字符(HS256)
- 定期轮换加密密钥
- 不要在令牌中存储敏感信息
- 始终验证令牌的签名和过期时间
- 考虑添加 IP 绑定等额外验证措施
完整示例封装
class JwtHandler {
private $key;
private $algorithm;
public function __construct($key, $algorithm = 'HS256') {
$this->key = $key;
$this->algorithm = $algorithm;
}
public function generateToken($payload) {
return JWT::encode($payload, $this->key, $this->algorithm);
}
public function validateToken($token) {
try {
return (array)JWT::decode($token, new Key($this->key, $this->algorithm));
} catch (Exception $e) {
throw new RuntimeException('Invalid token: '.$e->getMessage());
}
}
}







