PHP code example of petalbranch / jpt
1. Go to this page and download the library: Download petalbranch/jpt library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
petalbranch / jpt example snippets
use Petalbranch\Jpt\Jpt;
// 1. 初始化配置
$jpt = new Jpt([
'secret' => 'your-secure-secret-key-Must-Be-Complex', // 密钥
'iss' => 'auth.domain.com', // 签发人
'aud' => 'payment-service', // 受众
'ttl' => 3600, // 有效期 (秒)
'alg' => 'HS256' // 签名算法
]);
// 也可以这样初始化
// $options = [
// 'secret' => 'your-secure-secret-key-Must-Be-Complex', // 密钥
// 'iss' => 'auth.domain.com', // 签发人
// 'aud' => 'payment-service', // 受众
// 'ttl' => 3600, // 有效期 (秒)
// 'alg' => 'HS256' // 签名算法
// ];
//
// $jpt = new Jpt($options);
// 2. 设置公开数据 (Crown) - 客户端可见
$jpt->setCrownData([
'uid' => 10086,
'role' => 'admin'
'profile' => [
'name' => 'PetalUser',
'tags' => ['vip', 'beta']
]
]);
// 链式调用添加单个数据
$jpt->withCrown('nickname', 'PetalUser');
// 3. 设置私有数据 (Petal) - 仅服务端可解密
$jpt->setPetalData([
'email' => '[email protected] ',
'sex' => 1
]);
// 链式调用添加单个数据
$jpt->withPetal('contact', ['phone' => '13800138000']);
// 4. 生成字符串
$token = $jpt->generate();
// 5. 立即获取元数据
// 适用于需要将 JTI 存入 Redis 做黑名单或单点登录的场景
// 【逻辑说明】:
// 1. 若此前从未调用过 generate(),toJptPayload() 内部会自动触发一次生成。
// 2. 若此前已调用过 generate(),toJptPayload() 将直接返回最后一次生成的结果(快照)。
// 3. 如需基于新数据重新生成,必须在调用 toJptPayload() 之前显式再次执行 generate()。
$payloadObj = $jpt->toJptPayload();
$jti = $payloadObj->jti; // 获取系统生成的唯一标识 ID
$exp = $payloadObj->exp; // 获取过期时间戳
echo "Token: " . $token . "\n";
echo "JTI: " . $jti . "\n";
use Petalbranch\Jpt\Jpt;
use Petalbranch\Jpt\Exception\TokenValidationException;
$tokenString = '...客户端传来的Token...';
$jpt = new Jpt([
'secret' => 'your-secure-secret-key-Must-Be-Complex', // 必须与生成时一致
// 可选:设置验证白名单
'allowed_issuers' => ['auth.domain.com'],
'allowed_audiences' => ['payment-service', '*']
]);
try {
// 验证并获取载荷对象 (Payload)
$payload = $jpt->validate($tokenString);
// --- 验证成功,获取数据 ---
// 获取所有数据
$allCrown = $payload->getCrownData(null, []);
$allPetal = $payload->getPetalData(null, []);
// 获取单个数据
$uid = $payload->getCrownData('uid', 0);
$email = $payload->getPetalData('email', ''); // 解密后的数据
// 获取标准声明
$expireIn = $payload->getExpiration(); // 距离过期剩余秒数
$issuer = $payload->iss;
$audience = $payload('aud'); // V1.3.0+ 支持点号语法直接访问
// --- 方式 A: 传统方法 ---
$uid = $payload->getCrownData('uid', 0);
$email = $payload->getPetalData('email', '');
$age = $payload->getPetalData('age') ?? 0;
// --- 方式 B: v1.3.0+ 捷径访问 (推荐) ---
// 读取嵌套数据:c 代表 Crown, p 代表 Petal
$userName = $payload('c.profile.name') ?? 'Guest';
$userTag = $payload('c.profile.tags.0'); // 访问数组元素
$phone = $payload('p.contact.phone'); // 读取加密数据
echo "用户ID: {$uid}, 邮箱: {$email}";
} catch (TokenValidationException $e) {
// --- 验证失败 ---
// 401001: 格式错误
// 401005: 签名错误
// 401012: 令牌过期
http_response_code(401);
echo "认证失败: " . $e->getMessage() . " (Code: " . $e->getCode() . ")";
}
$payload('根节点.键名.子键名...')
// 假设 Crown 中有一个键名叫 "config.local" (包含点号)
// 错误写法: $ payload('c.config.local') -> 会被拆分为 config->local
// 正确写法:将含点号的键名作为独立参数
$value = $payload('c', 'config.local');
// 动态拼接
$key = 'name';
$value = $payload('c', 'user', 'profile', $key);
text
eyJpc3MiOiJ0ZXN0LWlzc3VlciIsImF1ZCI6InRlc3QtYXBwIiwibmJmIjoxNzY5NzUxNDQwL
CJpYXQiOjE3Njk3NTE0NDAsImV4cCI6MTc2OTc1NTA0MCwianRpIjoianB0LjdlZDM0ZmZlMW
E0MGZhZjY0N2ExZTY3MWQzMWY0OTE3IiwiYWxnIjoiSFMyNTYiLCJ0eXAiOiJKUFQifQ.4Ayk
nbQwWNCkJ2G8h8Lih9zin3GvB3OJn9-_z9ylBsGF-3-_n9LxBoOFn_CvzXzchQBl-SaJ-oDln
sGxn_RN-ol8nsOxnQzihs-Az3-ALe7.1ef1768264878c6e8cb0a3f9616d6ca3c1580e7fcf
7cf0b50f39764dc36eb170