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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:31:04