如何为Laravel Sanctum生成的Token设置自动过期时间?
Laravel 个人访问令牌设置过期及自动删除方法
1. 生成带过期时间的 Token
可以通过 createToken 方法的第三个参数(Laravel Sanctum v3+)指定过期时间,生成的 Token 会自动在 personal_access_tokens 表的 expires_at 字段存储过期时间,请求时框架会自动校验 Token 是否过期,过期则返回 401 未授权。
示例代码:
use Carbon\Carbon; // 生成24小时后过期的Token $token = $user->createToken('app_token', [], Carbon::now()->addHours(24))->plainTextToken;
注意:如果使用 Sanctum v2.x 版本,
createToken的参数顺序不同,第二个参数即为过期时间:$token = $user->createToken('app_token', Carbon::now()->addHours(24))->plainTextToken;
2. 自动删除过期的 Token 记录
Laravel 不会自动清理过期 Token,需要通过定时任务实现自动删除:
- 第一步:生成自定义命令
php artisan make:command PruneExpiredTokens
- 第二步:编写清理逻辑
打开生成的app/Console/Commands/PruneExpiredTokens.php,替换内容为:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Laravel\Sanctum\PersonalAccessToken; class PruneExpiredTokens extends Command { protected $signature = 'tokens:prune-expired'; protected $description = '删除所有已过期的个人访问令牌'; public function handle() { $deletedCount = PersonalAccessToken::where('expires_at', '<=', now())->delete(); $this->info("成功清理 {$deletedCount} 条过期令牌记录"); } }
- 第三步:配置定时任务
打开app/Console/Kernel.php,在schedule方法中添加任务调度(示例为每天执行一次):
protected function schedule(Schedule $schedule) { $schedule->command('tokens:prune-expired')->daily(); }
配置完成后,服务器需要运行 Laravel 调度器(可通过 crontab 设置:* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1),即可自动定期删除过期的 Token 记录。
内容的提问来源于stack exchange,提问作者Mishen Thakshana
相关产品推荐
相关产品推荐

