You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:14