
直接装 firebase/php-jwt 就行,别碰其他名字带 jwt 的包——绝大多数是过时、不维护或设计反模式的。
为什么不是 lcobucci/jwt 或 namshi/jose
这三个库里,firebase/php-jwt 是目前最轻量、文档最清晰、错误提示最直白的。它不强制依赖 PSR 标准实现,不抽象出一堆接口让你先写 5 行配置才能签一个 token;lcobucci/jwt 功能全但版本迭代激进(v4 到 v5 接口大改),且默认启用密钥轮换逻辑,新手容易卡在 Cannot resolve key;namshi/jose 已归档,Composer 安装会报 Package not found 或降级到 PHP 7.2 兼容版,不推荐。
用 composer require firebase/php-jwt,PHP 7.4+ 直接可用如果项目用了 Laravel,别额外装——Laravel 9+ 内置 Illuminate\Support\JwtToken 是封装层,底层仍是 firebase/php-jwt避免搜 “jwt composer” 后随手点进 GitHub star 多但 last commit 是 3 年前的库
composer require firebase/php-jwt 后立刻报错?检查这三处
常见报错不是库本身问题,而是环境或权限链路断了:
Class ‘Firebase\JWT\JWT’ not found:确认没漏掉 require ‘vendor/autoload.php’,或用了 PSR-4 自动加载但没声明 FireBase\JWT 命名空间映射Failed to open stream: Permission denied:Windows 下杀毒软件常锁住 vendor/ 里的 openssl 扩展调用,临时禁用再试Could not fetch packages…:国内网络可能卡在 packagist.org,加镜像:composer config -g repo.packagist composer https://packagist.phpcomposer.com(注意该镜像已停,应换为 https://packagist.laravel-china.com)
生成 token 时 $key 传字符串还是 OpenSSLAsymmetricKey?
取决于你用对称加密(HS256)还是非对称(RS256)。绝大多数内部 API 场景用 HS256 足够,$key 就是字符串;只有跨域、多服务验签才需 RS256,这时 $key 必须是 openssl_pkey_get_private() 返回的资源句柄。
HS256(推荐起步):$token = \Firebase\JWT\JWT::encode($payload, ‘my-secret-key’, ‘HS256’);RS256(需提前生成密钥对):$privateKey = openssl_pkey_get_private(‘file://path/to/private.key’);,然后传 $privateKey 给 encode()别把字符串密钥硬编码在代码里——用 $_ENV[‘JWT_SECRET’] 或 config/jwt.php 加载
真正麻烦的不是装库,是密钥管理方式和算法选型一旦定错,后期所有客户端都要同步改;而错误往往出现在验签环节,报 Signature verification failed 却查不出是 key 类型不对、时钟偏移没设、还是 header 里 alg 写成了 hs256(小写)。

评论(0)