当前位置:首页 > 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中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…