kelvinmo/simplejwt 是真正可用的轻量 jwt 库,无依赖、仅做编解码,需通过 composer require kelvinmo/simplejwt 安装,使用时须 use simplejwt\jwt,密钥不能为空且必须设 iat/exp 字段。

simple-jwt-auth 不是一个标准包名,也不存在于 Packagist 官方仓库中。你搜 composer require simple-jwt-auth 会失败——根本没这个包。
真正可用、维护活跃、且名字里带 “simple” 的是 kelvinmo/simplejwt,它轻量、无依赖、只做 JWT 编解码,适合手动集成进任意框架(Laravel、ThinkPHP、Slim 或原生 PHP)。
为什么找不到 simple-jwt-auth?
这不是拼写错误问题,而是命名混淆:
– tymon/jwt-auth 是 Laravel 专用插件(已基本弃用);
– firebase/php-jwt 是最通用的 JWT 库(推荐新项目首选);
– kelvinmo/simplejwt 是另一个轻量替代,API 更简洁,但社区规模小;
– simple-jwt-auth 在 Packagist 上查不到任何有效版本,也不是 Laravel 或 Symfony 官方生态组件。
如何正确安装 kelvinmo/simplejwt
执行以下命令即可:
composer require kelvinmo/simplejwt
注意几点:
- 不需要额外 publish 配置或 migrate 数据库——它不绑定任何框架逻辑
- 安装后自动加载,无需手动 require vendor/autoload.php(Composer 已处理)
- 类名是
SimpleJWT\JWT,不是JWT全局类,调用前必须use SimpleJWT\JWT; - 签名密钥必须为字符串,不能为
null或空字符串,否则encode()直接抛InvalidArgumentException
生成和验证 token 的最小可行代码
以原生 PHP 为例(Laravel/TP 只需把逻辑挪进 Controller 或 Service):
use SimpleJWT\JWT;
<p>$key = $_ENV['JWT_SECRET'] ?? 'dev-secret';
$payload = [
'sub' => 123, // subject,通常为 user_id
'iat' => time(), // 必须设,否则 decode 时校验失败
'exp' => time() + 3600, // 必须设,否则默认 exp=0 → 立即过期
];</p><p>try {
$token = JWT::encode($payload, $key);
echo $token;
} catch (\Exception $e) {
http_response_code(500);
echo 'JWT encode failed: ' . $e->getMessage();
}</p>
验证时同样要传密钥,并捕获异常:
try {
$decoded = JWT::decode($token, $key);
} catch (\SimpleJWT\InvalidTokenException $e) {
// 签名错、过期、格式非法等都会进这里
http_response_code(401);
exit('Unauthorized');
}
常见踩坑点:decode 总报 InvalidTokenException
90% 的情况不是代码问题,而是:
-
Authorization请求头格式不对:必须是Bearer <token></token>,少空格或拼错Bearer就失败 - 密钥不一致:
encode用的是$_ENV['JWT_SECRET'],decode却硬编码了'test' - 没设
iat或exp:该库默认严格校验时间字段,不设就视为无效 token - token 被 URL 编码过:前端用
fetch发请求时若没禁用自动编码,+ 号变空格,base64 串损坏 - PHP timezone 设置影响
time():确保date_default_timezone_set('UTC'),避免本地时区导致 exp 判定偏差
事情说清了就结束。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











