如何在Laravel 11中使用Sanctum从会话认证切换到令牌认证?
Laravel 11 Sanctum 从会话认证迁移到Bearer令牌认证步骤
1. 确认Sanctum基础配置
确保Laravel Sanctum已正确安装并配置:
- 检查
config/sanctum.php文件存在,若缺失可重新发布配置:php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" - Laravel 11默认已集成Sanctum中间件,无需手动在
app/Http/Kernel.php中添加。
2. 调整认证守卫配置
修改config/auth.php,将api守卫的驱动切换为sanctum:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'sanctum', // 替换原session驱动 'provider' => 'users', 'hash' => false, ], ],
3. 更新路由中间件
将API路由中使用的会话认证中间件(如auth或web)替换为auth:sanctum:
- 打开
routes/api.php,调整受保护路由的中间件:// 原会话认证路由示例 // Route::get('/user', function (Request $request) { // return $request->user(); // })->middleware('auth'); // 修改为令牌认证路由 Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum');
4. 实现令牌生成逻辑
添加用户登录并返回Bearer令牌的接口:
- 创建或修改
app/Http/Controllers/AuthController.php,编写登录方法:use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($credentials)) { return response()->json(['message' => '无效凭据'], 401); } $user = Auth::user(); $token = $user->createToken('api-access-token')->plainTextToken; return response()->json([ 'token' => $token, 'token_type' => 'Bearer', ]); } - 在
routes/api.php中注册无需认证的登录路由:Route::post('/login', [AuthController::class, 'login']);
5. 适配客户端请求
客户端请求API时,需在请求头中携带令牌:
Authorization: Bearer {你的令牌内容}
- 移除之前会话认证相关的Cookie携带逻辑,确保请求仅依赖Bearer令牌。
6. 测试令牌认证
使用curl或API测试工具验证流程:
- 发送登录请求获取令牌:
curl -X POST http://your-app-url/api/login -H "Content-Type: application/json" -d '{"email":"user@example.com","password":"your-password"}' - 使用返回的令牌访问受保护路由:
curl http://your-app-url/api/user -H "Authorization: Bearer {获取到的令牌}"
7. 清理冗余配置(可选)
- 若不再需要会话认证,可移除API路由中多余的
web中间件; - 无需SPA认证时,可在
config/sanctum.php中清空stateful域名列表:'stateful' => [],
内容的提问来源于stack exchange,提问作者Mostafa Aourik
相关产品推荐
相关产品推荐

