当前位置:首页 > PHP

php jwt redis实现

2026-02-15 20:12:21PHP

PHP 中使用 JWT 和 Redis 实现认证

环境准备 确保已安装 PHP 7.4+、Redis 扩展及 firebase/php-jwt 库。通过 Composer 安装 JWT 库:

composer require firebase/php-jwt

生成 JWT Token 使用 firebase/php-jwt 生成包含用户 ID 和过期时间的 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小时过期
    'user_id' => 123
];
$token = JWT::encode($payload, $key, 'HS256');

Redis 存储 Token 将生成的 Token 存入 Redis 并设置过期时间,确保与 JWT 过期时间一致:

php jwt redis实现

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setex('user_token:123', 3600, $token); // 键格式为 user_token:{user_id}

验证 Token 从请求头获取 Token,验证其有效性并检查 Redis 是否存在:

$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
    $token = $matches[1];
    try {
        $decoded = JWT::decode($token, new Key($key, 'HS256'));
        $user_id = $decoded->user_id;

        // 检查 Redis 中是否存在该 Token
        if ($redis->get("user_token:$user_id") !== $token) {
            throw new Exception("Token invalid or expired");
        }
        echo "验证成功,用户ID: " . $user_id;
    } catch (Exception $e) {
        http_response_code(401);
        echo "验证失败: " . $e->getMessage();
    }
}

注销 Token 用户登出时从 Redis 删除 Token:

php jwt redis实现

$redis->del('user_token:123');

自动续期 在每次验证 Token 时,若剩余有效期不足,可重新生成并更新 Redis:

$remainingTime = $decoded->exp - time();
if ($remainingTime < 1800) { // 剩余30分钟时续期
    $newPayload = array_merge((array)$decoded, ['exp' => time() + 3600]);
    $newToken = JWT::encode($newPayload, $key, 'HS256');
    $redis->setex("user_token:$user_id", 3600, $newToken);
    header('Authorization: Bearer ' . $newToken);
}

注意事项

  • 密钥需足够复杂并定期更换。
  • 生产环境建议使用 HTTPS 传输 Token。
  • Redis 需配置持久化以防止数据丢失。
  • 考虑使用连接池管理 Redis 连接以提高性能。

标签: phpjwt
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。 创…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…