jwt php 实现
JWT 在 PHP 中的实现
安装依赖库
使用 Composer 安装 firebase/php-jwt 库,这是一个流行的 JWT 实现库:
composer require firebase/php-jwt
生成 JWT Token
以下代码展示了如何生成一个 JWT Token:
<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
$key = "your_secret_key"; // 替换为你的密钥
$payload = array(
"iss" => "http://example.org", // 签发者
"aud" => "http://example.com", // 接收方
"iat" => time(), // 签发时间
"exp" => time() + 3600, // 过期时间(1小时后)
"data" => array( // 自定义数据
"user_id" => 123,
"username" => "john_doe"
)
);
$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>
验证 JWT Token
以下代码展示了如何验证和解码 JWT Token:
<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
$key = "your_secret_key"; // 替换为你的密钥
$jwt = "your_jwt_token"; // 替换为需要验证的 JWT Token
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
print_r($decoded);
} catch (Exception $e) {
echo '验证失败: ', $e->getMessage(), "\n";
}
?>
自定义算法
firebase/php-jwt 支持多种算法,如 HS256、RS256 等。以下是使用 RS256 的示例:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
// 生成 RSA 密钥对
$privateKey = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
...你的私钥内容...
-----END RSA PRIVATE KEY-----
EOD;
$publicKey = <<<EOD
-----BEGIN PUBLIC KEY-----
...你的公钥内容...
-----END PUBLIC KEY-----
EOD;
$payload = array(
"iss" => "http://example.org",
"iat" => time(),
"exp" => time() + 3600,
"data" => array(
"user_id" => 123
)
);
// 使用 RS256 算法生成 Token
$jwt = JWT::encode($payload, $privateKey, 'RS256');
echo $jwt;
// 验证 Token
try {
$decoded = JWT::decode($jwt, $publicKey, array('RS256'));
print_r($decoded);
} catch (Exception $e) {
echo '验证失败: ', $e->getMessage(), "\n";
}
?>
错误处理
在实际应用中,需要妥善处理可能的异常情况,如 Token 过期、签名无效等:
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
// 业务逻辑处理
} catch (\Firebase\JWT\ExpiredException $e) {
echo 'Token 已过期';
} catch (\Firebase\JWT\SignatureInvalidException $e) {
echo '签名验证失败';
} catch (Exception $e) {
echo '其他错误: ' . $e->getMessage();
}
实际应用场景
在实际应用中,JWT 常用于用户认证。以下是一个简单的登录接口示例:

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
// 假设用户通过表单提交了用户名和密码
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// 验证用户凭据(这里简化处理)
if ($username === 'admin' && $password === 'password') {
$key = "your_secret_key";
$payload = array(
"iss" => "your_issuer",
"iat" => time(),
"exp" => time() + 3600,
"user_id" => 1,
"username" => $username
);
$jwt = JWT::encode($payload, $key, 'HS256');
echo json_encode(array("token" => $jwt));
} else {
http_response_code(401);
echo json_encode(array("error" => "无效的凭据"));
}
?>
注意事项
密钥需要妥善保管,不应硬编码在代码中或提交到版本控制系统。可以考虑使用环境变量或专门的密钥管理服务。
对于生产环境,建议使用非对称加密算法(如 RS256)而非对称加密算法(如 HS256),以提供更好的安全性。
Token 的过期时间应根据实际需求设置,不宜过长也不宜过短。常见设置为 1-24 小时。
敏感数据不应存储在 JWT 的 payload 中,因为 JWT 可以被解码(尽管不能被篡改)。






