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

Laravel中Fortify登录后Sanctum保护路由返回未认证问题排查

问题排查与解决方案

1. 确认登录后获取并携带Sanctum令牌

Fortify默认登录是基于会话的认证,而auth:sanctum中间件依赖API令牌。你需要在登录成功后生成并返回令牌:

  • 自定义Fortify登录响应:创建app/Http/Responses/LoginResponse.php文件,添加令牌生成逻辑:
<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{
    public function toResponse($request)
    {
        $token = $request->user()->createToken('api-token')->plainTextToken;
        
        return response()->json([
            'user' => $request->user(),
            'token' => $token
        ]);
    }
}
  • 在config/fortify.php中指定该响应类:
'login_response' => App\Http\Responses\LoginResponse::class,
  • 登录成功后,Postman会拿到token字段,后续请求API时,在Headers中添加Authorization: Bearer {你的token值}(注意Bearer后有空格)

2. 配置Sanctum状态域

打开config/sanctum.php,确保stateful数组包含你的测试域名(如本地开发的localhost:8000):

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
    '%s%s',
    'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
    env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),

也可直接在.env中设置:SANCTUM_STATEFUL_DOMAINS=localhost:8000

3. 检查API请求的认证头

在Postman请求受保护路由时:

  • 切换到Headers标签页
  • 添加键Authorization,值为Bearer 你的令牌内容
  • 确保请求的是API路由(如/api/user,而非web路由)

4. 验证用户模型的Sanctum Trait

检查User模型,确认引入HasApiTokens Trait:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ...
}

5. 跨域场景下的CORS配置

若前后端分离,打开config/cors.php:

  • 设置allowed_origins为前端域名(如['http://localhost:3000'],测试阶段可临时用['*'])
  • 设置allowed_methods为['*']
  • 设置allowed_headers为['*']
  • 确保supports_credentials为true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:01:13