
本文详解如何利用 laravel sanctum 实现两个不同代码仓库、独立部署的 laravel 应用(app a 与 app b)之间的安全用户认证共享,涵盖 api token 机制、跨域配置、session 共享限制及生产环境最佳实践。
本文详解如何利用 laravel sanctum 实现两个不同代码仓库、独立部署的 laravel 应用(app a 与 app b)之间的安全用户认证共享,涵盖 api token 机制、跨域配置、session 共享限制及生产环境最佳实践。
Laravel Sanctum 默认设计面向单应用 SPA 认证(如 Vue/React 前端调用同一 Laravel 后端 API),但其灵活的 token 管理机制也支持跨 Laravel 应用的认证集成——前提是明确区分使用场景:不共享 Session,而共享用户身份与 API Token 信任链。
✅ 推荐方案:基于 API Token 的无状态跨应用认证
这是最实用、安全且符合 Sanctum 设计哲学的方式。核心思路是:
- App A(主认证中心)负责用户登录、生成并颁发 Sanctum Token;
- App B(客户端应用)通过可信通道(如后端直连或 OAuth2-style token exchange)获取该 Token;
- App B 使用该 Token 向 App A 的受保护 API 发起请求,由 App A 验证 Token 并返回用户上下文。
示例流程(App B 调用 App A 的用户信息接口)
-
App A 开启 Sanctum API 认证支持(config/sanctum.php):
'stateful' => ['app-a.com', 'app-b.com'], // 显式声明可维持 state 的域名(仅用于 Cookie 认证,此处非必需) 'guard' => ['web', 'api'], // 确保 API guard 已启用
-
App A 提供 Token 创建接口(需登录态):
// 在 App A 中,例如:/api/v1/token/create Route::middleware('auth:sanctum')->post('/token/create', function (Request $request) { $token = $request->user()->createToken('app-b-access'); return response()->json([ 'token' => $token->plainTextToken, 'expires_at' => $token->accessToken->expires_at, ]); }); -
App B 在服务端(非浏览器 JS)安全调用该接口(避免暴露用户凭证):
// 在 App B 的控制器中(使用 Guzzle) use Illuminate\Support\Facades\Http;
$response = Http::withToken($adminApiToken) // 使用预置管理 Token ->post('https://www.php.cn/link/8e7ad9f076740e3652a62ae9e328c53f');
if ($response->successful()) { $appBToken = $response->json()['token']; // 存储于当前会话或短期缓存(不可持久化明文存储!) session(['sanctum_token' => $appBToken]); }
4. **App B 后续请求携带 Token 访问 App A 的受保护资源**:
```php
$userProfile = Http::withToken(session('sanctum_token'))
->get('https://app-a.com/api/v1/user/profile')
->json();⚠️ 重要注意事项
- 禁止共享 Session Cookie:由于 App A 和 App B 域名不同(如 app-a.com vs app-b.com),浏览器同源策略阻止跨域 Cookie 共享。Sanctum 的 stateful 模式在此场景下不可用。
- Token 生命周期管理:API Token 默认永不过期(除非手动撤销)。建议在 App B 中实现 Token 刷新逻辑,并监听 token_expired 响应。
-
安全性前提:
- 所有通信必须通过 HTTPS;
- App B 获取 Token 的接口需严格鉴权(如仅允许内部服务 IP 或专用 API Key);
- 避免在前端 JavaScript 中直接处理用户凭证或长期 Token。
- 替代方案评估:若需更健壮的跨域认证(如 SSO),建议升级至 Laravel Passport(OAuth2)或集成第三方 IdP(如 Keycloak、Auth0),而非强行扩展 Sanctum。
✅ 总结
Sanctum 支持跨 Laravel 应用认证,但必须放弃“共享登录态”的直觉认知,转而采用以 API Token 为信任载体、服务端协同验证的模式。该方案轻量、可控、符合 REST 原则,适用于微服务架构或松耦合应用协作场景。始终遵循最小权限原则,将 Token 作用域(abilities)细化到具体操作级别,方能兼顾功能与安全。










