使用 auth:sanctum 中间件保护接口需确保四点:API守卫驱动设为sanctum;用户模型启用HasApiTokens trait;路由正确套用auth:sanctum中间件;客户端请求携带标准Bearer Token。

直接用 auth:sanctum 中间件就能保护接口,但关键不在“加不加”,而在“加得对不对”——中间件生效依赖正确的配置链:模型、守卫、路由分组、请求头格式,缺一不可。
确保 API 守卫驱动设为 sanctum
打开 config/auth.php,检查 guards['api'] 配置:
-
'driver' => 'sanctum'(不能是token或jwt) -
'provider' => 'users'(对应你实际使用的用户模型 provider)
如果要支持管理员等多模型,需额外配置独立 guard(如 admin),并指向对应的 provider 和模型。
用户模型必须启用 HasApiTokens
在 app/Models/User.php 中确认已引入 trait:
use Laravel\Sanctum\HasApiTokens;- 并在 class 声明中包含
use HasApiTokens;
否则 $user->createToken() 会报错或生成的 token 无法被验证。
路由必须套在 auth:sanctum 中间件下
在 routes/api.php 中,用闭包或控制器方式包裹受保护路由:
Route::middleware('auth:sanctum')->get('/profile', [ProfileController::class, 'show']);- 不要只写
auth或sanctum.auth—— 正确写法是auth:sanctum - 若用于 SPA 场景(如 Vue/React 前端同域),还需确保
EnsureFrontendRequestsAreStateful已注册在$middlewareGroups['api']中
客户端请求必须带合法 Bearer Token
Sanctum 只识别标准 Authorization: Bearer {token} 请求头:
- 不是
X-Sanctum-Token(该 header 是 Jetstream 前端 SDK 封装的别名,后端原生不解析) - 不是
token=xxx查询参数或 cookie(除非走 session 模式且已配好跨域与 SameSite) - token 必须是调用
$user->createToken('name')->plainTextToken返回的明文字符串,且未过期、未撤销
Postman 或 curl 测试时,务必在 Headers 标签页手动添加:
Key: Authorization Value: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...











