php 实现JWT

ops/2024/10/21 6:06:34/

在 PHP 中,JSON Web Token (JWT) 是一种开放标准 (RFC 7519) 用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证系统,如 OAuth2 或基于令牌的身份验证。

以下是一个基本的 PHP 实现 JWT 生成和验证的代码示例。

JWT 的组成部分

JWT 包含三个部分:

  1. Header(头部):说明算法和令牌类型。
  2. Payload(有效载荷):包含声明(如用户数据、过期时间等)。
  3. Signature(签名):用于验证令牌是否被篡改。

JWT 格式如下:
header.payload.signature

基本步骤

  1. 编码:使用 Base64 编码 Header 和 Payload。
  2. 签名:使用 Header 中定义的算法对编码后的 Header 和 Payload 进行签名。
  3. 验证:解析 JWT 时,通过检查签名是否有效来验证令牌。

代码实现

php"><?phpclass JWT
{private static $secretKey = 'your_secret_key'; // 加密使用的秘钥private static $algo = 'HS256';  // 使用的算法/*** 生成JWT* * @param array $payload 数据负载* @return string*/public static function generateJWT($payload){// 1. 生成header$header = json_encode(['alg' => self::$algo, 'typ' => 'JWT']);$base64Header = self::base64UrlEncode($header);// 2. 生成payload$base64Payload = self::base64UrlEncode(json_encode($payload));// 3. 生成signature$signature = hash_hmac('sha256', "$base64Header.$base64Payload", self::$secretKey, true);$base64Signature = self::base64UrlEncode($signature);// 4. 组合JWT$jwt = "$base64Header.$base64Payload.$base64Signature";return $jwt;}/*** 验证JWT* * @param string $token JWT令牌* @return array|bool 如果验证成功返回payload,否则返回false*/public static function verifyJWT($token){// 1. 拆分JWT$parts = explode('.', $token);if (count($parts) !== 3) {return false;}list($base64Header, $base64Payload, $base64Signature) = $parts;// 2. 解码Header和Payload$header = json_decode(self::base64UrlDecode($base64Header), true);$payload = json_decode(self::base64UrlDecode($base64Payload), true);$signature = self::base64UrlDecode($base64Signature);// 3. 验证签名$expectedSignature = hash_hmac('sha256', "$base64Header.$base64Payload", self::$secretKey, true);if (!hash_equals($signature, $expectedSignature)) {return false;}// 4. 验证过期时间if (isset($payload['exp']) && $payload['exp'] < time()) {return false;}return $payload;}/*** Base64URL编码* * @param string $data* @return string*/private static function base64UrlEncode($data){return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');}/*** Base64URL解码* * @param string $data* @return string*/private static function base64UrlDecode($data){return base64_decode(strtr($data, '-_', '+/'));}
}

说明:

  1. 生成 JWT

    • 使用  generateJWT($payload)  方法生成 JWT。
    •  header  包含签名算法信息(这里使用 HS256),payload 包含用户信息或其他声明。
    • hash_hmac('sha256') 方法签名生成的 JWT。
  2. 验证 JWT

    • 使用 verifyJWT($token) 方法验证 JWT。
    • 验证签名是否正确,以及 payload 中是否设置了过期时间(可选)。
  3. Base64 编码/解码

    • 使用 base64UrlEncode() base64UrlDecode() 实现 URL 安全的 Base64 编码。

测试代码

php">// 测试JWT生成
$payload = ['user_id' => 123,'username' => 'john_doe','exp' => time() + 3600  // 过期时间1小时
];$jwt = JWT::generateJWT($payload);
echo "Generated JWT: " . $jwt . PHP_EOL;// 测试JWT验证
$decodedPayload = JWT::verifyJWT($jwt);
if ($decodedPayload) {echo "JWT is valid! Payload: " . print_r($decodedPayload, true) . PHP_EOL;
} else {echo "Invalid JWT!" . PHP_EOL;
}

JWT 生成结果示例

php">Generated JWT: eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJ1c2VyX2lkIjogMTIzLCAidXNlcm5hbWUiOiAiam9obl9kb2UiLCAiZXhwIjogMTYxNjg1MjIwMn0.J0wLkhlUkTftKzVzR7Y9pVwSBU-WESCTwks2FyUwDUU
JWT is valid! Payload: Array
([user_id] => 123[username] => john_doe[exp] => 1616852202
)

说明:

  • 过期时间 exp:你可以在 payload 中加入 exp,它代表 JWT 过期的时间戳,通常用来限制令牌的有效期。
  • 签名算法:这里使用的是 HS256(HMAC-SHA256),你可以根据需求换成其他的对称或非对称签名算法。

应用场景

  1. 用户认证:基于 JWT 的用户登录、身份验证机制。
  2. API 授权:通过 JWT 传递身份验证信息,允许或拒绝 API 请求。
  3. 微服务间通信:在分布式系统中,JWT 可以用于服务之间的身份验证和授权。

http://www.ppmy.cn/ops/111013.html

相关文章

【论文阅读】视觉分割新SOTA: Segment Anything(SAM)

导言 随着基于对比文本—图像对的预训练&#xff08;CLIP&#xff09;方法或者模型、聊天生成预训练转换器&#xff08;ChatGPT&#xff09;、生成预训练转换器-4&#xff08;GPT-4&#xff09;等基础大模型的出现&#xff0c;通用人工智能&#xff08; AGI&#xff09;的研究…

Kafka 基于SASL/SCRAM动态认证部署,kafka加账号密码登录部署

文章目录 前言下载 kafka安装启动zookeeper添加账号密码 启动kafka修改kafka配置文件增加jaas授权文件修改启动文件&#xff0c;启动kafka检查是否部署成功 offset explore 连接 前言 其实挺简单的几个配置文件&#xff0c;问大模型一直没说到点上&#xff0c;绕晕了。SASL/SC…

LeetCode题练习与总结:基本计算器 Ⅱ--227

一、题目描述 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表达式计算…

DesignPattern设计模式

1 前言 1.1 内容概要 理解使用设计模式的目的掌握软件设计的SOLID原则理解单例的思想&#xff0c;并且能够设计一个单例理解工厂设计模式的思想&#xff0c;能够设计简单工厂&#xff0c;理解工厂方法了解建造者模式的思想&#xff0c;掌握其代码风格理解代理设计模式的思想&a…

代码随想录训练营 Day60打卡 图论part10 SPFA算法 Bellman-Ford 之判断负权回路 Bellman-Ford 之单源有限最短路

代码随想录训练营 Day60打卡 图论part10 一、Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 例题&#xff1a;卡码94. 城市间货物运输 I 题目描述 某国为促进城市间经济交流&#xff0c;决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c;通过…

[数据集][目标检测]葡萄成熟度检测数据集VOC+YOLO格式1123张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1123 标注数量(xml文件个数)&#xff1a;1123 标注数量(txt文件个数)&#xff1a;1123 标注…

Python、PyTorch与cuda的版本对应表

常见的Python和PyTorch版本对应关系。 PyTorch版本对应的PythonPyTorch1.0Python 2.7&#xff0c;3.5&#xff0c;3.6&#xff0c;3.7PyTorch1.1Python 2.7&#xff0c;3.5&#xff0c;3.6&#xff0c;3.7PyTorch1.2Python 2.7&#xff0c;3.5&#xff0c;3.6&#xff0c;3.7P…

深度优先算法,广度优先算法,hill climbing,贪心搜索,A*算法,启发式搜索算法是什么,比起一般搜索法算法有什么区别

深度优先算法&#xff08;Depth-First Search, DFS&#xff09; 深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点&#xff0c;尽可能深地搜索树的分支。当节点v的所在边都已被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程…