Laravel如何使用Sanctum进行API认证?(SPA实战)

发布时间 - 2025-12-16 00:00:00    点击率:
Sanctum 是 Laravel 官方推荐的轻量级 API 认证方案,专为 SPA 设计,基于 token + CSRF 实现无状态认证;需安装配置、执行迁移、设置 API guard;登录分三步:获取 CSRF cookie、提交凭证并生成 token、前端携带 Bearer Token 请求;路由用 auth:sanctum 中间件保护;登出须后端销毁 token 并前端清理。

Sanctum 是 Laravel 官方推荐的轻量级 API 认证方案,特别适合 SPA(单页应用)场景——它不依赖 session cookie 的传统 Web 认证,而是通过 token + CSRF 保护实现安全、无状态的前后端分离登录。

一、安装与基础配置

在 Laravel 项目中执行:

  • composer require laravel/sanctum
  • php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
  • php artisan migrate(生成 personal_access_tokens 表)

然后在 app/Providers/AuthServiceProvider.phpboot() 方法中添加:
Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);(可选,若自定义 Token 模型)
并在 config/auth.php 中确保 'api' guard 使用 'sanctum' driver。

二、SPA 登录流程(关键三步)

前端(如 Vue/React)向后端发起登录请求时,需配合 Laravel 的 CSRF 机制:

  • 先 GET /sanctum/csrf-cookie:触发服务端设置 XSRF-TOKEN cookie(前端自动携带)
  • 再 POST /login:提交邮箱/密码,后端验证成功后调用 Auth::attempt(),再用 auth()->user()->createToken('spa')->plainTextToken 生成 token
  • 响应中返回 token(不存 cookie):前端将其存在 localStorage 或 pinia/vuex 状态中,后续所有 API 请求在 Authorization: Bearer {token} 头中携带

三、API 路由保护与用户获取

routes/api.php 中使用 middleware('auth:sanctum')

  • Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum');
  • 注意:Sanctum 的 auth:sanctum 中间件会自动识别 Bearer Token 或已认证的 Web session(兼容 SSR 场景)
  • 若仅限 SPA,建议显式禁用 session 驱动,避免混淆;可在中间件组中排除 web 中间件

四、登出与 Token 管理

登出不是清空前端 token 就完事,必须通知后端销毁对应 token:

  • 前端发送 DELETE 请求到 /logout(需带 token)
  • 后端处理:auth()->user()->currentAccessToken()->delete();
  • 如需批量注销所有设备,用 auth()->user()->tokens()->delete();
  • 前端收到成功响应后,再清除本地存储的 token 和用户信息

基本上就这些。Sanctum 对 SPA 友好,不强制刷新 token、不依赖 Redis、开箱即用,只要注意 CSRF 初始化和 token 生命周期管理,就能稳住前后端身份链路。


# php  # vue  # react  # laravel  # redis  # 前端  # go  # composer  # cookie  # app  # access  # 中间件  # csrf  # require 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何打造高效商业网站?建站目的决定转化率  Angular 表单中正确绑定输入值以确保提交与验证正常工作  新三国志曹操传主线渭水交兵攻略  微信h5制作网站有哪些,免费微信H5页面制作工具?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  微信小程序 canvas开发实例及注意事项  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何用美橙互联一键搭建多站合一网站?  如何在腾讯云服务器上快速搭建个人网站?  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel Docker环境搭建教程_Laravel Sail使用指南  使用Dockerfile构建java web环境  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Python3.6正式版新特性预览  javascript基本数据类型及类型检测常用方法小结  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  微信公众帐号开发教程之图文消息全攻略  如何快速查询域名建站关键信息?  如何选择PHP开源工具快速搭建网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  深圳网站制作培训,深圳哪些招聘网站比较好?  EditPlus 正则表达式 实战(3)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel中的Facade(门面)到底是什么原理  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何自定义错误页面(404, 500)?(代码示例)  如何快速搭建高效简练网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  使用C语言编写圣诞表白程序  HTML 中动态设置元素 name 属性的正确语法详解  EditPlus中的正则表达式 实战(4)  Linux系统运维自动化项目教程_Ansible批量管理实战  Android okhttputils现在进度显示实例代码  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Android中AutoCompleteTextView自动提示  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何在云主机上快速搭建网站?  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何使用Blade组件和插槽?(Component代码示例)