Laravel项目API+Web双认证(Sanctum+Cookie)整合方案咨询
Sanctum 本身内置同域名下的 Session Cookie 认证能力,和 Laravel 默认的 web 守卫共享底层 Session 存储,只需做少量配置即可实现两端认证状态互通。
1. 核心配置调整
- 修改
config/sanctum.php中的stateful配置项,加入你的应用全域名(含端口,本地开发示例:localhost:8000,127.0.0.1:8000),Sanctum 会自动对这些域名的请求启用 Session 校验逻辑 - 修改
config/cors.php:paths数组加入api/*和sanctum/csrf-cookiesupports_credentials设为true,确保跨域场景下 Cookie 可正常传递
- 路由配置无需大改:
routes/api.php下的管理后台路由统一用auth:sanctum中间件包裹,routes/web.php下的根路径应用路由保持默认auth中间件即可
2. 统一登录逻辑实现
不需要维护两套登录体系,任意一端登录成功后另一端会自动识别认证状态:
- 如果你通过 API 接口实现管理员登录:
- 登录请求前先调用
/sanctum/csrf-cookie接口初始化 CSRF 令牌,该接口会自动写入XSRF-TOKENCookie - 登录接口中校验账号密码通过后,调用
Auth::attempt($credentials)写入 Session,Laravel 会自动返回 Session Cookie
- 登录请求前先调用
- 如果你通过 Web 端表单登录:登录成功后生成的 Session 会被 Sanctum 自动识别,请求
/api/**接口时无需额外传入 Token - 客户端发起 API 请求时需开启凭证携带(Axios 示例:配置
withCredentials: true),确保浏览器自动带上 Cookie 信息
3. 状态同步与退出
- 两端认证状态完全互通:Web 视图中调用
Auth::check()和 API 接口中调用auth('sanctum')->check()会返回完全一致的结果 - 退出逻辑统一调用
Auth::logout()即可销毁 Session,两端认证状态会同时失效
4. 多角色适配(可选)
如果管理员和普通 Web 端用户分属不同用户表,只需额外做以下配置:
- 在
config/auth.php中新增管理员专属的守卫与用户提供者 - 管理员专属 API 路由组使用
auth:sanctum:你的管理员守卫名中间件,Web 端管理员路由使用auth:你的管理员守卫名中间件即可,Session 仍会自动共享不冲突
常见问题排查
- 本地多端口开发时,将
.env中的SESSION_DOMAIN设为根域名(示例:.localhost),确保 Cookie 在不同端口下可共享 - 不要使用 Sanctum 的 API Token 模式调用接口,必须走 Cookie 模式才能和 Web 守卫共享登录态
内容的提问来源于stack exchange,提问作者Reekavitcha
相关产品推荐
相关产品推荐

