Laravel Passport新手咨询:无Access Token时调用不同路由需自定义中间件吗?
Hey there! 作为刚上手Laravel Passport的新手,你的需求完全可以通过自定义中间件来实现,这也是最清晰、符合Laravel架构的解决方案。下面我一步步给你拆解具体怎么做:
为什么需要自定义中间件?
Laravel自带的auth:api中间件的作用是强制验证Access Token——如果请求没有携带有效token,它会直接返回401 Unauthorized错误,而不是帮你路由到另一个控制器方法。你的场景需要根据“有无有效token”做分支逻辑,所以必须自己写一个中间件来处理这个判断。
具体实现步骤
1. 生成自定义中间件
首先在终端运行Artisan命令生成中间件文件:
php artisan make:middleware CheckForAccessToken
这会在app/Http/Middleware/目录下创建一个CheckForAccessToken.php文件。
2. 编写中间件的判断逻辑
打开刚生成的中间件文件,替换handle方法的内容,实现token检测和分支处理:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Laravel\Passport\Token; class CheckForAccessToken { public function handle(Request $request, Closure $next) { // 初始化token有效性标记 $hasValidToken = false; // 检查请求头中的Bearer Token(Passport默认携带方式) if ($authHeader = $request->header('Authorization')) { $tokenValue = str_replace('Bearer ', '', $authHeader); $token = Token::find($tokenValue); // 验证token存在且未被吊销 $hasValidToken = !is_null($token) && !$token->revoked; } // 可选:检查URL参数中的token(如果你的业务允许这种携带方式) elseif ($tokenValue = $request->query('token')) { $token = Token::find($tokenValue); $hasValidToken = !is_null($token) && !$token->revoked; } if (!$hasValidToken) { // 没有有效token时,直接调用控制器的indexTest方法并返回响应 $controller = app(\App\Http\Controllers\CategoryBranchController::class); return $controller->indexTest($request); } // 有有效token时,放行请求到原路由(即@index方法) return $next($request); } }
3. 注册中间件
打开app/Http/Kernel.php,找到$routeMiddleware数组,添加我们的中间件别名:
protected $routeMiddleware = [ // ... 其他中间件 'check.token' => \App\Http\Middleware\CheckForAccessToken::class, ];
4. 配置API路由
最后在routes/api.php中,给目标路由加上我们的自定义中间件:
use App\Http\Controllers\CategoryBranchController; Route::get('/category-branches', [CategoryBranchController::class, 'index']) ->middleware('check.token');
补充说明
- 如果你还需要确保
@index方法只能被携带有效token的请求访问,其实上面的逻辑已经做到了——只有检测到有效token才会放行到@index,否则直接跳转到@indexTest。 - 另一种思路是在前端根据有无token选择调用不同路由,但这种方式把逻辑丢给了前端,不如后端中间件处理更统一、安全。
内容的提问来源于stack exchange,提问作者KLAng
相关产品推荐
相关产品推荐

