lcobucci/jwt 是 PHP 中最贴近 JWT RFC 规范的库,推荐临时 API 用 v3.4(支持 PHP ≥5.6),生成 token 必须签名且设合理 exp/nbf/iat,密钥严禁硬编码。

lcobucci/jwt 是目前 PHP 生态中签名逻辑最清晰、API 设计最贴近 JWT RFC 规范的库之一。它不自动帮你做“登录 → 生成 → 存储 → 验证”整套流程,但正因如此,你才能精准控制每个环节——尤其适合临时 API、内部调试、轻量级服务认证等场景。
安装时必须指定 v3.4 或 v4.x 版本
直接 composer require lcobucci/jwt 很可能装到 v4.x(要求 PHP ≥ 7.1),而很多旧项目还在用 PHP 7.0 或 5.6。如果你遇到 Class 'Lcobucci\JWT\Builder' not found 或 Cannot declare class,大概率是版本错配。
- v3.4 支持 PHP ≥ 5.6,对应类名是
Builder/Parser/Signer\Hmac\Sha256 - v4.x 要求 PHP ≥ 7.1,类结构全变:改用
Configuration::forSymmetricSigner()+builder(),Builder类已废弃 - 临时 API 建议锁定 v3.4:
composer require lcobucci/jwt:^3.4
生成 token 必须带签名,否则不是合法 JWT
你看到的两段式字符串(如 eyJhbGciOi... .eyJpc3MiOi...)只是 header + payload,没有 signature —— 这不是 JWT,只是 base64 编码的 JSON,**无法验证真伪,完全不安全**。
- 签名必须调用
getToken($signer, $key),不能只调getToken() -
$signer推荐用new Sha256()(HMAC-SHA256 最通用) -
$key必须是字符串(v3.4)或Key对象(v4.x),**绝不能硬编码在代码里**;临时 API 可从环境变量读:new Key($_ENV['JWT_SECRET'] ?? 'dev-key-for-test-only') - 常见错误:
withClaim('password', 'xxx')—— 别往 token 里塞明文密码,token 是客户端可见的
关键参数别写反:nbf、exp、iat 的时间逻辑
临时 API 往往需要「立刻可用」或「仅限 5 分钟内使用」,这时三个时间字段容易设错:
-
issuedAt($time)(iat):建议用time(),不是new DateTimeImmutable()(v3.4 不支持对象传入) -
canOnlyBeUsedAfter($time + 60)(nbf):如果想「立刻生效」,就传$time;传$time - 1也行(兼容部分系统时钟偏差) -
expiresAt($time + 300)(exp):单位是秒,300 = 5 分钟;若设成$time * 300就会过期在 1970 年 - 漏掉
issuedBy()或permittedFor()不影响生成,但验证时会失败 —— 临时 API 若不验证 issuer/audience,可跳过;但建议至少设issuedBy('your-api')方便日后加约束
临时 token 的最小可行代码(v3.4)
以下代码可直接运行,生成一个带签名、5 分钟过期、含用户 ID 的 token:
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key;
<p>$time = time();
$token = (new Builder())
->issuedBy('api.example.com')
->identifiedBy(uniqid('', true), true)
->issuedAt($time)
->expiresAt($time + 300)
->withClaim('uid', 123)
->getToken(new Sha256(), new Key('your-secret-key-here'));</p><p>echo (string) $token;
</p>
注意:your-secret-key-here 必须替换,且长度建议 ≥ 32 字符;临时 API 可用 openssl rand -base64 32 快速生成。别用 123456 或 test —— 签名形同虚设。
真正麻烦的从来不是生成 token,而是后续怎么验证、怎么拒绝重放、怎么处理密钥轮换。临时 API 容易忽略的是:token 一旦发出,只要没过期、签名正确,服务端就默认信任 —— 所以 exp 时间宁短勿长,密钥宁换勿留。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











