- 认证鉴权
- 后端
- 安全
【免费下载链接】jwt-auth
🔐 JSON Web Token Authentication for Laravel & Lumen
本文是 tymon/jwt-auth 在Lumen微服务框架中的完整安装实战指南,覆盖从
composer require拉取依赖、复制并注册jwt.php配置、修改bootstrap/app.php注册服务提供者与路由中间件,到通过php artisan jwt:secret生成签名密钥的全过程。读完本文,你将能够在一台全新的 Lumen 应用中完成 jwt-auth 的基础接入,并理解每一步在源码层面的实际作用,为后续的登录、鉴权与 Token 刷新功能打下基础。
安装前置条件
在开始之前,先确认你的 Lumen 项目满足 jwt-auth 的运行要求。从 composer.json 的require段可以看到,当前仓库版本的硬性依赖为:
- PHP
^8.0 - illuminate/auth、illuminate/contracts、illuminate/http、illuminate/support:
^9.0|^10.0|^11.0|^12.0|^13.0(即 Laravel/Lumen 9 到 13 系列均可) - lcobucci/jwt
^4.0|^5.0(负责 JWT 的编码、解码与签名) - nesbot/carbon
^2.69|^3.0(用于处理iat、exp、nbf等时间类 Claim)
这意味着:Lumen 5.x 等旧版本不在本版本的支持范围内,请确保你的应用运行在 PHP 8.0+ 与 Lumen 9+ 环境再继续。
第一步:通过 Composer 安装
在原文档(docs/lumen-installation.md)中,安装方式只有一个命令——拉取最新稳定版本:
composer require tymon/jwt-auth执行完成后,Composer 会将包安装到vendor/tymon/jwt-auth目录,并依据composer.json中的 PSR-4 自动加载规则("Tymon\\JWTAuth\\": "src/")完成类映射注册。安装成功后,你可以通过composer show tymon/jwt-auth确认版本。
第二步:复制并注册配置文件
2.1 复制配置文件
与 Laravel 通过vendor:publish自动发布配置不同,Lumen 没有vendor:publish机制,因此原文档要求手动复制:
- 将
vendor/tymon/jwt-auth/config/config.php复制到 Lumen 应用的config目录; - 重命名为
jwt.php。
复制后,你可以在 Lumen 项目中通过config('jwt.xxx')读取所有配置项,配置的权威版本见仓库根目录的 config/config.php。
2.2 注册配置:$app->configure('jwt')
接下来,在bootstrap/app.php中、任何中间件声明之前加入一行:
$app->configure('jwt');这行代码的作用是让 Lumen 将config/jwt.php文件加载进配置仓库(Lumen 默认只加载应用自身有限的配置文件,新增配置必须显式configure)。
这里有一个值得注意的细节:即使你不手动添加这一行,服务提供者的boot()方法里其实也会调用一次configure('jwt')。查看 LumenServiceProvider.php:
public function boot() { $this->app->configure('jwt'); $path = realpath(__DIR__.'/../../config/config.php'); $this->mergeConfigFrom($path, 'jwt'); ... }但强烈建议仍按文档手动执行:mergeConfigFrom只负责合并包内默认配置,不会覆盖你复制到config/jwt.php中的自定义值;而尽早调用$app->configure('jwt')能确保在服务提供者注册之前配置就已就绪,避免某些时序问题。
第三步:修改bootstrap/app.php
3.1 注册服务提供者
在bootstrap/app.php的 providers 区域做两处修改(docs/lumen-installation.md):
// 取消这一行的注释 $app->register(App\Providers\AuthServiceProvider::class); // 新增这一行 $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);AuthServiceProvider是 Lumen 自带的认证服务提供者,取消注释后 Lumen 才能正确加载用户认证相关的 User Provider;Tymon\JWTAuth\Providers\LumenServiceProvider是 jwt-auth 为 Lumen 定制的服务提供者。
从源码看,LumenServiceProvider 继承自 AbstractServiceProvider,其register()方法会一次性完成大量容器绑定:
- 注册
tymon.jwt(核心 JWT 类)、tymon.jwt.auth(JWTAuth 门面背后实例)、tymon.jwt.manager(Manager)、tymon.jwt.blacklist(黑名单)、tymon.jwt.parser(Token 解析器)等单例; - 注册
tymon.jwt.secret命令单例,并调用$this->commands('tymon.jwt.secret')将jwt:secret命令注册进 Artisan(见 AbstractServiceProvider.php); - 通过
extendAuthGuard()向 Laravel Auth 扩展jwtguard 驱动(见 AbstractServiceProvider.php),后续才能使用auth('api')这类 API。
此外,LumenServiceProvider 的boot()中还包含 Lumen 特有的一步:
$this->app['tymon.jwt.parser']->addParser(new LumenRouteParams);它额外注册了 LumenRouteParams 解析器,支持从 Lumen 的路由参数中提取 Token。注意该文件的注释明确警告:“Only use this parser if you know what you're doing!”——它依赖某些 Lumen 版本对路由数组的不规范内部结构,仅当你确实需要从路由参数取 Token 时才依赖它,常规场景建议使用Authorization头或查询字符串传 Token。
3.2 注册auth路由中间件
在同一文件中,取消auth中间件的注释:
$app->routeMiddleware([ 'auth' => App\Http\Middleware\Authenticate::class, ]);至此,auth中间件别名可用。LumenServiceProvider 还会额外注册 4 个 jwt-auth 自带中间件别名(见 AbstractServiceProvider.php):
| 别名 | 类 | 用途 |
|---|---|---|
jwt.auth | Authenticate | 校验请求中携带的 Token 并认证用户 |
jwt.check | Check | 仅校验 Token 有效性,不解析用户 |
jwt.refresh | RefreshToken | 校验并返回一个刷新后的新 Token |
jwt.renew | AuthenticateAndRenew | 认证用户的同时刷新 Token |
这些中间件与 Lumen 原生auth中间件配合,可以灵活覆盖不同路由的鉴权需求。
第四步:生成签名密钥
4.1 执行命令
配置文件注册完毕后,运行以下命令生成密钥(docs/lumen-installation.md):
php artisan jwt:secret命令会在你的.env文件中写入一行类似JWT_SECRET=foobar的配置,并在终端输出jwt-auth secret [xxx] set successfully.的成功提示。这就是后续用于给 Token 签名的密钥,由 config/config.php 中的'secret' => env('JWT_SECRET')读取。
4.2 命令的源码级行为
jwt:secret命令实现在 JWTGenerateSecretCommand.php,其执行逻辑值得展开:
- 密钥生成:使用
Str::random(64)生成一个 64 位随机字符串(见 L43),远比文档示例中的foobar安全; - 定位
.env文件:通过envPath()方法兼容不同 Laravel/Lumen 版本(见 L111-L123); - 首次写入:若
.env中不存在JWT_SECRET,则追加一行JWT_SECRET=xxx(见 L55-L57); - 覆盖更新:若已存在,则弹出确认提示“This will invalidate all existing tokens. Are you sure you want to override the secret key?”,确认后替换旧值(见 L71-L75)。
命令还支持三个选项(见 L24-L27),可用于非交互式部署场景:
| 选项 | 缩写 | 说明 |
|---|---|---|
--show | -s | 只显示生成的密钥,不修改任何文件 |
--always-no | - | 若密钥已存在则直接跳过,不生成新密钥 |
--force | -f | 跳过覆盖确认,直接替换已有密钥 |
例如,在 CI/CD 或脚本化部署中,可以用php artisan jwt:secret --show获取密钥并写入环境变量,或使用php artisan jwt:secret --force静默轮换密钥。
4.3 密钥与签名算法:对称与非对称
文档特别强调:密钥如何参与签名,取决于你选择的算法。这一点在 config/config.php 中有完整说明:
- 对称算法(HMAC):
HS256、HS384、HS512使用JWT_SECRET这一个随机字符串同时完成签名与验签; - 非对称算法(RSA/ECDSA):
RS256/384/512、ES256/384/512使用keys配置块中的公钥/私钥对:
'keys' => [ 'public' => env('JWT_PUBLIC_KEY'), // 例:'file://path/to/public/key' 'private' => env('JWT_PRIVATE_KEY'), // 例:'file://path/to/private/key' 'passphrase'=> env('JWT_PASSPHRASE'), // 私钥口令,未设置可为 null ],算法本身通过'algo' => env('JWT_ALGO', Tymon\JWTAuth\Providers\JWT\Provider::ALGO_HS256)配置,默认HS256。默认使用的 JWT 底层实现是lcobucci/jwt(providers.jwt默认指向Tymon\JWTAuth\Providers\JWT\Lcobucci),其构造时接收secret、algo、keys三个参数(见 AbstractServiceProvider.php)。
安装完成后的关键配置速览
复制好的config/jwt.php里还有一批对鉴权行为影响重大的参数,建议安装后立即过一遍(完整注释见 config/config.php):
| 配置键 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
ttl | JWT_TTL | 60 | Token 有效期(分钟),设为null则永不过期(需同时把exp从required_claims移除) |
refresh_ttl | JWT_REFRESH_TTL | 20160(2 周) | Token 可被刷新的窗口期(分钟),null表示无限刷新 |
algo | JWT_ALGO | HS256 | 签名算法 |
required_claims | - | iss, iat, exp, nbf, sub, jti | 校验 Token 时必须存在的 Claim,缺失会抛TokenInvalidException |
leeway | JWT_LEEWAY | 0 | 时间戳容差(秒),缓解多服务器时钟偏移对iat/nbf/exp的影响 |
blacklist_enabled | JWT_BLACKLIST_ENABLED | true | 是否启用黑名单以支持登出/失效 Token |
blacklist_grace_period | JWT_BLACKLIST_GRACE_PERIOD | 0 | 黑名单宽限期(秒),防止并发请求因 Token 刷新而集体失败 |
lock_subject | - | true | 是否自动添加prvClaim,防止多认证模型下同 id Token 相互冒充 |
安装后的下一步:跑通登录与鉴权
安装与配置完成后,建议按以下顺序快速验证(详细步骤见 docs/quick-start.md):
- 让 User 模型实现
JWTSubject契约(src/Contracts/JWTSubject.php):实现getJWTIdentifier()(返回用户主键,写入subClaim)与getJWTCustomClaims()(返回自定义 Claim 数组); - 配置认证 guard:在 Lumen 的
config/auth.php中设置'defaults' => ['guard' => 'api'],并将guards.api的driver设为jwt; - 实现
login/me/logout/refresh接口:通过auth()->attempt($credentials)签发 Token、auth()->user()获取当前用户、auth()->logout()注销(将 Token 加入黑名单)、auth()->refresh()刷新 Token。
至此,你的 Lumen 应用已经具备完整的 JWT 认证能力。完整的 Auth guard 方法参考(attempt、login、userOrFail、invalidate、tokenById、payload、claims、setTTL等)见 docs/auth-guard.md;更多配置项详解见 docs/configuration.md;Laravel 完整版安装方式见 docs/laravel-installation.md。
- 认证鉴权
- 后端
- 安全
【免费下载链接】jwt-auth
🔐 JSON Web Token Authentication for Laravel & Lumen
相关推荐
jwt-auth 在 Laravel 中的安装与配置指南:Composer 安装、服务注册、配置发布与密钥生成
jwt auth 在 Laravel 中的安装与配置指南:Composer 安装、服务注册、配置发布与密钥生成 导读 :本文是基于 jwt auth( tymo
认证鉴权后端安全JWT认证与量子随机数:tymon/jwt-auth密钥生成
JWT认证与量子随机数:tymon/jwt auth密钥生成 你是否曾担心JWT密钥不够安全?是否想知道如何用最简单的方式生成高强度密钥?本文将带你深入了解ty
认证鉴权后端安全tymon/jwt-auth与服务网格集成:Istio认证策略
tymon/jwt auth与服务网格集成:Istio认证策略 在微服务架构中,服务间通信的安全性至关重要。你是否还在为服务网格环境下的认证策略配置而烦恼?本文
认证鉴权后端安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考