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
相关产品推荐
相关产品推荐

