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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:01:53