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