公司动态
Lumen Passport差异化TTL指南:如何为不同客户端设置不同令牌过期时间
Lumen Passport差异化TTL指南如何为不同客户端设置不同令牌过期时间【免费下载链接】lumen-passportMaking Laravel Passport work with Lumen项目地址: https://gitcode.com/gh_mirrors/lu/lumen-passport在基于 Lumen 构建的 API 服务中Lumen Passport让 Laravel Passport 的 OAuth 能力在 Lumen 微框架下顺利运行。而如何为不同客户端设置不同令牌过期时间是很多开发者从能用走向好用时遇到的关键问题。本文将用最短的时间带你掌握 Lumen Passport 差异化 TTL 的配置技巧让不同客户端拥有各自独立的访问令牌有效期策略。为什么需要为不同客户端设置不同令牌过期时间Laravel Passport 默认只支持设置一个全局令牌过期时间TTL所有客户端共用同一个有效期。但在真实业务中这种一刀切往往并不合理移动端 App用户可能几天才打开一次令牌过期时间太短会频繁要求重新登录体验糟糕️桌面端 / Web 端安全性要求高令牌有效期应更短降低被盗用后的风险窗口内部服务 / 第三方合作伙伴可以给予更短或更长的差异化授权周期。如果你正在使用 Lumen Passport好消息是它额外提供了按客户端client_id设置令牌过期时间的能力这正是 Laravel Passport 原生所不具备的特性。Lumen Passport 是什么30 秒快速了解简单来说Lumen Passport是一个让 Laravel Passport 与 Lumen 兼容的服务提供者扩展包。它解决了两者之间的兼容性问题并额外带来几个实用增强功能例如支持路由前缀配置允许同一客户端多令牌并存支持不同客户端设置不同令牌过期时间提供passport:purge清理过期令牌命令。这些增强逻辑都集中在 src/LumenPassport.php 中核心的 TTL 方法tokensExpireIn()定义在 src/LumenPassport.php。默认机制全局 TTL 是怎么工作的在了解差异化之前先看看默认行为。Lumen Passport 未指定客户端 ID 时会直接回退到 Laravel Passport 的全局实现use Carbon\Carbon; use Dusterio\LumenPassport\LumenPassport; // 设置全局令牌过期时间14 天后过期 LumenPassport::tokensExpireIn(Carbon::now()-addDays(14));这段代码会让所有客户端统一使用 14 天有效期。而差异化配置的关键就在于tokensExpireIn()方法的第二个参数。最快配置方法两行代码实现差异化 TTL 为不同客户端设置不同令牌过期时间只需要在服务提供者的boot()方法中调用tokensExpireIn()并传入client_id即可。/** file app/Providers/AuthServiceProvider.php */ use Carbon\Carbon; use Dusterio\LumenPassport\LumenPassport; class AuthServiceProvider extends ServiceProvider { public function boot() { LumenPassport::routes($this-app); // 客户端 ID 为 1例如移动端 App有效期 14 天 LumenPassport::tokensExpireIn(Carbon::now()-addDays(14), 1); // 客户端 ID 为 2例如桌面端有效期 30 分钟 LumenPassport::tokensExpireIn(Carbon::now()-addMinutes(30), 2); /* rest of boot */ } }就这样不同客户端便拥有了各自独立的令牌过期时间。当客户端通过密码授权请求令牌时Lumen Passport 会根据请求中的client_id动态选择对应的 TTL这一逻辑由重写后的 AccessTokenController.php 完成。未配置的客户端怎么办如果某个客户端没有单独配置它会自动回退到 Laravel Passport 的全局 TTL不影响既有逻辑兼容性非常好。如何验证配置是否生效✅你可以用 curl 模拟一次密码授权请求观察响应中的expires_in字段curl --location --request POST {{APP_URL}}/oauth/token \ --header Content-Type: application/json \ --data-raw { grant_type: password, client_id: 1, client_secret: {{CLIENT_SECRET}}, username: {{USER_EMAIL}}, password: {{USER_PASSWORD}}, scope: * }响应示例{ token_type: Bearer, expires_in: 1209600, access_token: ******, refresh_token: ****** }expires_in为 1209600 秒正好对应 14 天说明差异化 TTL 已生效。你还可以参考项目测试文件 tests/LumenPassport/integration.php其中完整验证了客户端专属 TTL 与全局 TTL 互不影响的行为。实战建议与注意事项 优先使用配置或数据库存储 client_id不要把客户端 ID 硬编码在服务提供者中便于后续维护⏰搭配刷新令牌策略访问令牌有效期短时建议合理设置刷新令牌的时长提升用户体验定期清理过期令牌可运行php artisan passport:purge清理过期令牌对应命令源码位于 src/Console/Commands/Purge.php生产环境务必测试在切换差异化 TTL 前先在小流量客户端上验证避免影响线上授权流程。总结通过 Lumen Passport 提供的tokensExpireIn()第二参数能力你可以轻松实现为不同客户端设置不同令牌过期时间移动端给长时效、桌面端给短时效、内部服务按需定制。相比原生 Laravel Passport 的全局 TTL这套差异化方案既灵活又安全是 Lumen API 认证体系中非常值得掌握的一招。如果项目尚未引入可通过composer require dusterio/lumen-passport安装仓库地址https://gitcode.com/gh_mirrors/lu/lumen-passport按官方文档完成 bootstrap/app.php 中的服务提供者注册后即可开始配置你的差异化令牌过期时间。【免费下载链接】lumen-passportMaking Laravel Passport work with Lumen项目地址: https://gitcode.com/gh_mirrors/lu/lumen-passport创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考