如何为API和Web分别配置Passport API,实现不同未认证响应逻辑
解决方案:用Passport的API认证守卫区分Web与API路由
不用修改已有的Web路由代码,我们只需要针对API路由单独配置Passport提供的auth:api中间件,它会自动处理未认证请求并返回JSON响应,完全不会干扰Web路由原有的重定向逻辑。
步骤1:确保Passport已正确配置
如果你还没完成Passport的基础安装,先执行以下命令(已安装可跳过):
composer require laravel/passport php artisan migrate php artisan passport:install
接着在app/Providers/AuthServiceProvider.php中注册Passport路由:
use Laravel\Passport\Passport; public function boot() { $this->registerPolicies(); Passport::routes(); // 可选:设置令牌过期时间,比如15天 // Passport::tokensExpireIn(now()->addDays(15)); }
最后在config/auth.php里,把API守卫的驱动改为passport:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // 这里替换为passport 'provider' => 'users', 'hash' => false, ], ],
步骤2:给API路由应用auth:api中间件
打开routes/api.php,把你的API路由包裹在使用auth:api中间件的路由组里,示例如下:
use Illuminate\Http\Request; Route::middleware('auth:api')->group(function () { // 示例:获取当前认证用户信息 Route::get('/user', function (Request $request) { return $request->user(); }); // 在这里添加你的其他API路由 // 比如:Route::get('/posts', [PostController::class, 'index']); });
为什么这样有效?
- Web路由继续使用原来的
auth中间件(对应web守卫),未认证时依旧会重定向到登录页,完全保留原有逻辑。 - API路由使用
auth:api中间件(对应api守卫,驱动为Passport),未认证时会自动返回JSON格式的401响应,默认格式如下:
{ "message": "Unauthenticated." }
自定义未认证响应(可选)
如果想替换默认的JSON内容,可以修改异常处理器:
打开app/Exceptions/Handler.php,在render方法中添加针对AuthenticationException的处理:
use Illuminate\Auth\AuthenticationException; public function render($request, Throwable $exception) { if ($exception instanceof AuthenticationException && $request->expectsJson()) { return response()->json([ 'status' => 'error', 'message' => '您需要先登录才能访问该API接口', 'code' => 401 ], 401); } return parent::render($request, $exception); }
这样所有未认证的API请求都会返回你自定义的JSON响应,Web路由的重定向逻辑不受任何影响。
内容的提问来源于stack exchange,提问作者Rohit Dalal
相关产品推荐
相关产品推荐

