Laravel 8 如何配置 Sanctum 实现前后端分离 API 认证

文章导读
Laravel 8 使用 Sanctum 实现 API 认证时,必须执行 php artisan migrate 创建 personal_access_tokens 表,否则会出现 SQLSTATE[42S02]: Base table or view not found 错误。
📋 目录
  1. A 原因分析
  2. B 解决方案
  3. C 第一步:安装与基础配置
  4. D 第二步:配置跨域与 Stateful 域名
  5. E 第三步:实现登录接口生成 Token
  6. F 第四步:保护 API 路由
  7. G 第五步:前端携带 Token 请求
  8. H 注意事项
  9. I 参考来源
A A

Laravel 8 如何配置 Sanctum 实现前后端分离 API 认证

Laravel 8 使用 Sanctum 实现 API 认证时,必须执行 php artisan migrate 创建 personal_access_tokens 表,否则会出现 SQLSTATE[42S02]: Base table or view not found 错误。

原因分析

Sanctum 是 Laravel 官方推荐的轻量级 API 认证方案,专为 SPA 设计,基于 token + CSRF 实现无状态认证。很多开发者遇到 401 认证失败,核心原因是混淆了 Sanctum 的两种模式:SPA 模式(带 session)和 Token 模式(无状态 API)。根据 2026 年 4 月 4 日的技术资料,Laravel 9+ 默认在 api 中间件组已预设 sanctum,但 Laravel 8 需要手动在 app/Http/Kernel.php 的 api 中间件组中添加 \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class。若 config/sanctum.php 中的'stateful'配置未匹配实际请求来源域名,API 认证会失败却无明确报错。

解决方案

第一步:安装与基础配置

在 Laravel 8 项目中执行以下命令(来自 2022 年 3 月 28 日 CSDN 博客实测):

1. composer require laravel/sanctum

2. php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

3. php artisan migrate(生成 personal_access_tokens 表)

在 app/Models/User.php 中引入 HasApiTokens trait:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable { use HasApiTokens; }

注意:若漏掉 HasApiTokens,调用 createToken() 时会报错"Call to undefined method"。

第二步:配置跨域与 Stateful 域名

前后端分离需配置跨域,安装 fruitcake/laravel-cors 包(2025 年 9 月 6 日资料):

composer require fruitcake/laravel-cors

在 config/cors.php 中设置 allowed_origins 为 Vue 应用域名,如 ['http://your-vue-app.com']。在.env 中配置 SANCTUM_STATEFUL_DOMAINS=your-vue-app.com(多个用逗号分隔,不要带协议或端口)。根据 2026 年 2 月 23 日教程,若前端跑在 http://test.local:3000 但没加进环境变量,会静默 fallback 到 token 认证,导致 401 错误。

第三步:实现登录接口生成 Token

在 routes/api.php 中定义登录路由(2025 年 11 月 13 日实测代码):

Route::post('/login', function(Request $request) {

$credentials = $request->only('email', 'password');

if(Auth::attempt($credentials)) {

$user = Auth::user();

$token = $user->createToken('auth_token')->plainTextToken;

return response()->json(['token' => $token], 200);

}

Laravel 8 如何配置 Sanctum 实现前后端分离 API 认证

return response()->json(['message' => 'Invalid credentials'], 401);

});

关键:必须取$token->plainTextToken,若直接返回整个模型会报错"Object of class Laravel\Sanctum\NewAccessToken could not be converted to string"(2026 年 2 月 23 日常见错误记录)。

第四步:保护 API 路由

在 routes/api.php 中使用 middleware('auth:sanctum')(2025 年 12 月 16 日官方推荐):

Route::middleware('auth:sanctum')->group(function () {

Route::get('/user', function (Request $request) { return $request->user(); });

});

注意:纯 API 场景应使用'sanctum'中间件,auth:sanctum 专用于 SPA 路由(2026 年 4 月 4 日技术说明)。

第五步:前端携带 Token 请求

前端拿到 token 后存在 localStorage 或 Pinia/Vuex 状态中,后续所有 API 请求在 Authorization 头中携带(2025 年 9 月 6 日 Vue 实战):

Authorization: Bearer {token}

注意:中间是空格,不是冒号或等号,否则 Postman 测试会返回 401(2026 年 3 月 31 日新手指南)。

注意事项

1. Token 刷新机制:Sanctum 没有自动刷新机制,刷新 token = 创建新 token + 主动删旧 token。代码:$user->currentAccessToken()->delete(); $newToken = $user->createToken();(2026 年 3 月 31 日实测)

2. 登出必须通知后端:前端清除 token 不够,需发送 DELETE 请求到/logout,后端执行 auth()->user()->currentAccessToken()->delete();(2025 年 12 月 16 日)

3. Token 过期时间:由 config/sanctum.php 的'expiration'控制(单位分钟),设为 null 表示永不过期,但生产环境慎用(2026 年 3 月 31 日)

4. 多用户表认证:若有 Student、Teacher 等多表,需为每种用户类型定义独立 Provider 和 Guard,各模型都要引入 HasApiTokens trait(2025 年 10 月 7 日多用户表认证指南)

5. 常见报错 Route [login] not defined:Laravel 自身前端页未登录跳转方法不适用于 API,需自定义未登录的异常处理返回 JSON 格式(2022 年 3 月 28 日 CSDN 博客)

参考来源

来源:CSDN 博客 - Laravel8 Sanctum API 认证 +Vue 问卷 搭建前后端分离 SPA 应用(2022 年 3 月 28 日)

来源:技术教程 - Laravel 怎么实现 API 身份验证 _ Laravel Sanctum 令牌配置方法【教程】(2026 年 2 月 23 日)

来源:新手指南 - LaravelAPI 新手如何做用户认证_LaravelSanctum 认证教程【指南】(2026 年 3 月 31 日)

来源:实践文档 - Composer 如何安装 Laravel Sanctum API 认证_Composer 安装 Laravel Sanctum 实践(2026 年 4 月 4 日)