Laravel11 Sanctum会话模式下非登录/登出接口返回401未授权求助
解决Laravel 11 Sanctum会话模式API 401未授权问题
以下是排查和解决的核心步骤:
1. 检查路由中间件配置
会话模式依赖Laravel的Session机制,默认api中间件组不包含Session相关中间件。确保你的API路由使用包含StartSession、AuthenticateSession的中间件组:
- 可直接将路由放在
routes/web.php(默认自带Session中间件) - 或在
app/Providers/RouteServiceProvider.php中修改api路由的中间件组,添加Session相关中间件:
// RouteServiceProvider.php public function boot() { $this->routes(function () { // 为API路由指定包含Session的中间件组 Route::middleware(['web', 'auth:sanctum']) ->prefix('api') ->group(base_path('routes/api.php')); }); }
2. 确保Postman正确携带Cookie和CSRF令牌
会话模式下,登录成功后服务器会返回laravel_session和XSRF-TOKEN两个Cookie,后续请求必须携带这两个Cookie,同时请求头需包含X-XSRF-TOKEN:
- 在Postman中开启Settings > General > Send cookies选项
- 发送登录请求后,Postman会自动保存Cookie;后续请求手动添加请求头
X-XSRF-TOKEN,值取XSRF-TOKENCookie的内容(可通过Postman环境变量自动提取)
3. 验证Sanctum状态域配置
检查config/sanctum.php中的stateful数组,确保包含你的请求来源(本地开发通常是localhost、127.0.0.1):
// config/sanctum.php 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,127.0.0.1,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))),
若使用Postman请求,确保.env中的SANCTUM_STATEFUL_DOMAINS包含localhost。
4. 确认登录逻辑正确
登录时必须使用Laravel的Auth::attempt()方法,确保会话被正确创建:
// 示例登录控制器代码 public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required' ]); if (!Auth::attempt($credentials)) { return response()->json(['message' => 'Invalid credentials'], 401); } return response()->json(Auth::user()); }
5. 检查Session驱动配置
确保.env中的SESSION_DRIVER不是array(数组驱动为临时存储,服务重启后会话丢失),建议使用file或database:
SESSION_DRIVER=file
内容的提问来源于stack exchange,提问作者marwen khefacha
相关产品推荐
相关产品推荐

