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认证:
- 给用户表添加
api_token字段,生成迁移文件:php artisan make:migration add_api_token_to_users_table - 在迁移文件里添加字段:
public function up() { Schema::table('users', function (Blueprint $table) { $table->string('api_token', 80)->unique()->nullable()->default(null); }); } - 执行迁移:
php artisan migrate - 给管理员用户生成API Token:可以在后台UI加个生成按钮,或者用
tinker命令行生成:
然后执行:php artisan tinker$user = App\Models\User::find(1); // 替换成你的管理员ID $user->api_token = Str::random(60); $user->save(); - 在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简单很多:
- 安装Sanctum:
composer require laravel/sanctum - 发布配置文件并迁移:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate - 在
app/Http/Kernel.php的api中间件组里添加:'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], - 在
User模型里引入HasApiTokenstrait:use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... } - 给管理员生成Token:
php artisan tinker$user = App\Models\User::find(1); $token = $user->createToken('Admin API Token')->plainTextToken; - 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
相关产品推荐
相关产品推荐

