Laravel Passport技术问询:Client Token创建、中间件替换及令牌过期设置
嘿,咱们逐个解决你遇到的这两个Laravel Passport问题:
问题1:将OAuth路由的中间件替换为
auth:api 默认情况下,Passport的OAuth客户端管理路由(比如创建客户端的接口)依赖web和auth中间件,但你的纯API应用需要用auth:api来保护这些路由。这里有两种靠谱的实现方式:
方式一:批量修改Passport路由的中间件
在AuthServiceProvider的boot方法中,不要直接调用Passport::routes(),而是用Route::group包裹路由注册,指定auth:api中间件:
use Laravel\Passport\Passport; use Illuminate\Support\Facades\Route; public function boot() { $this->registerPolicies(); // 用auth:api中间件保护所有Passport路由 Route::group(['middleware' => 'auth:api'], function () { // 如果只需要客户端相关路由,用回调指定;要所有路由就去掉回调直接写Passport::routes() Passport::routes(function ($router) { $router->forClients(); // 可选:如果需要其他路由,比如令牌管理,可以加$router->forAccessTokens();等 }); }); }
方式二:手动注册特定路由(更灵活)
如果你只想修改客户端创建这部分路由,也可以在routes/api.php里手动定义路由,指向Passport的控制器,同时挂载auth:api中间件:
use Laravel\Passport\Http\Controllers\ClientController; Route::middleware('auth:api')->group(function () { Route::get('/oauth/clients', [ClientController::class, 'forUser']); Route::post('/oauth/clients', [ClientController::class, 'store']); // 其他客户端管理路由,比如编辑、删除,也可以在这里添加 });
问题2:设置单个个人访问令牌的过期时间
当然可以!Passport提供了两种层级的过期时间设置:
全局设置(所有个人令牌通用)
在AuthServiceProvider的boot方法里,用personalAccessTokensExpireIn()设置全局默认过期时间,比如30天:
Passport::personalAccessTokensExpireIn(now()->addDays(30));
单个令牌自定义过期时间
如果要给某一个令牌单独设置过期时间,在创建令牌时传入第三个参数即可覆盖全局设置。比如给当前认证用户创建一个7天过期的令牌:
$user = auth()->user(); // 参数分别是:令牌名称、权限范围(空数组表示全权限)、过期时间 $token = $user->createToken('我的自定义令牌', [], now()->addDays(7)); return $token->plainTextToken;
这样这个特定令牌就会在7天后失效,其他令牌依然遵循全局规则。
内容的提问来源于stack exchange,提问作者DeathKing
相关产品推荐
相关产品推荐

