
JWT的“iat”和“nbf”声明都是与时间相关的。“iat”声明“iat”代表“Issued At”即JWT的签发时间。这个声明用于记录JWT是什么时候创建的。它可以帮助我们追踪JWT的年龄或者在某些情况下用于判断JWT是否太旧而需要被替换。通俗解释想象一下你买了一个面包面包上有一个生产日期标签告诉你这个面包是什么时候做出来的。这个日期就像是JWT的“iat”声明它告诉你这个JWT是什么时候“出生”的。“nbf”声明“nbf”代表“Not Before”即JWT不可以被接受处理的最早时间点。这个声明定义了一个时间在这个时间之前JWT不应该被接受。这可以防止JWT在其预期的生效日期之前被误用。通俗解释再想象一下你有一个生日蛋糕的优惠券但是这个优惠券只能在你的生日当天或者之后使用。这个“生日当天”就像是JWT的“nbf”声明它告诉你在这个日期之前你不能使用这个优惠券或JWT。底层原理这两个声明都是基于Unix时间戳的即从1970年1月1日UTC开始计算的秒数。当验证JWT时系统会检查当前时间与“iat”和“nbf”声明的值以确保JWT是在正确的时间范围内使用的。PHP实例代码?php require vendor/autoload.php; // 引入JWT库确保已经安装了firebase/php-jwt库 use \Firebase\JWT\JWT; $key your_secret_key; // 密钥用于签名和验证JWT // 生成JWT的Payload部分并设置iat和nbf声明 $payload array( sub user123, // 用户ID或其他标识 iat time(), // JWT的签发时间设置为当前时间 nbf time() 60 // JWT的最早可接受时间设置为当前时间后60秒 ); // 使用密钥对Payload进行签名生成JWT $jwt JWT::encode($payload, $key); echo 生成的JWT: . $jwt . \n; // 模拟在nbf时间之后验证JWT的过程 sleep(70); // 等待70秒以确保过了nbf设置的时间 try { $decoded JWT::decode($jwt, $key, array(HS256)); echo JWT验证成功Payload数据\n; print_r($decoded); } catch (Exception $e) { echo JWT验证失败: . $e-getMessage() . \n; } ?在这个示例中我们创建了一个JWT其中“iat”被设置为当前时间而“nbf”被设置为当前时间后的60秒。这意味着JWT将在签发后的60秒内不可用60秒后才能被验证和接受。我们通过sleep(70)模拟了时间的流逝以确保在尝试验证JWT时已经过了“nbf”指定的时间。请注意如果尝试在“nbf”指定的时间之前验证JWT将会得到一个异常表明JWT尚不可用。在实际应用中你应该根据需要合理设置“iat”和“nbf”的值并在验证JWT时考虑这些时间约束。同时确保你的应用能够优雅地处理JWT验证过程中可能出现的任何异常。