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

Laravel项目测试API时如何绕过认证等级限制?

解决Laravel API调用跳转到登录页的问题

你遇到的问题本质是Web端Session认证和API认证的机制不匹配:php artisan make:auth生成的是基于Session的Web认证,当无Session的API请求触发auth中间件时,Laravel会默认重定向到登录页,而非返回API友好的401响应。下面给你几个简便的解决方案,不用复杂的预请求脚本:

方案1:给API路由单独配置API认证中间件

Laravel默认的routes/api.php路由文件已经绑定了api中间件组,和Web端的web中间件组完全隔离。建议把你的API路由从web.php移到api.php里,同时把路由的认证中间件从auth改成auth:api(指定使用API guard):

// routes/api.php
Route::middleware('auth:api')->group(function () {
    // 你的更新/创建服务的API路由
    Route::post('/services', 'ServiceController@store');
    Route::put('/services/{id}', 'ServiceController@update');
});

接下来配置API Token认证:

  1. 给用户表添加api_token字段,生成迁移文件:
    php artisan make:migration add_api_token_to_users_table
    
  2. 在迁移文件里添加字段:
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('api_token', 80)->unique()->nullable()->default(null);
        });
    }
    
  3. 执行迁移:php artisan migrate
  4. 给管理员用户生成API Token:可以在后台UI加个生成按钮,或者用tinker命令行生成:
    php artisan tinker
    
    然后执行:
    $user = App\Models\User::find(1); // 替换成你的管理员ID
    $user->api_token = Str::random(60);
    $user->save();
    
  5. 在Postman里,给请求添加Authorization头,值为Bearer {你的API Token},或者直接在URL参数里加?api_token={你的Token}。

方案2:修改认证中间件,避免API请求重定向

如果你不想调整路由位置,可以修改app/Http/Middleware/Authenticate.php里的redirectTo方法,让API请求返回JSON错误而非重定向:

protected function redirectTo($request)
{
    // 非JSON请求(Web端)才跳转到登录页
    if (!$request->expectsJson()) {
        return route('login');
    }
    // API请求返回401 JSON响应
    return response()->json(['message' => '未授权,请先登录'], 401);
}

这个方案只是解决跳转问题,你还是需要配合方案1的Token认证才能正常访问API。

方案3:用Laravel Sanctum实现轻量API认证(推荐)

如果你的Laravel版本是8.x及以上,Sanctum是官方推荐的轻量API认证方案,比Passport简单很多:

  1. 安装Sanctum:
    composer require laravel/sanctum
    
  2. 发布配置文件并迁移:
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    php artisan migrate
    
  3. 在app/Http/Kernel.php的api中间件组里添加:
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    
  4. 在User模型里引入HasApiTokens trait:
    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
        // ...
    }
    
  5. 给管理员生成Token:
    php artisan tinker
    
    $user = App\Models\User::find(1);
    $token = $user->createToken('Admin API Token')->plainTextToken;
    
  6. Postman请求里添加Authorization: Bearer {生成的Token}头即可访问受保护的API。

为什么之前的Basic Auth没生效?

你之前用的Basic Auth是针对Web端Session认证的,而API请求需要用API guard的Basic认证配置。如果一定要用Basic Auth,可以修改config/auth.php:

'guards' => [
    // ...
    'api' => [
        'driver' => 'basic',
        'provider' => 'users',
    ],
],

然后路由用auth:api中间件,Postman里选择Basic Auth填写管理员用户名和密码,就能正常访问了。

内容的提问来源于stack exchange,提问作者Striker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:45:58