如何使用Sanctum结合Firebase Authentication实现Laravel API认证
实现方案
本方案完全不需要在数据库存储令牌,所有校验逻辑直接对接Firebase的idToken校验接口,适配Sanctum的认证体系,具体步骤如下:
前置准备
- 安装Firebase官方PHP SDK:
composer require kreait/firebase-php - 下载Firebase服务账号JSON凭据文件,放入项目
storage目录,在.env中添加配置:FIREBASE_CREDENTIALS=/storage/firebase/service-account.json
步骤1:自定义Sanctum令牌校验逻辑
打开app/Providers/AppServiceProvider.php,在boot方法中覆盖Sanctum默认的令牌校验逻辑:
use Illuminate\Support\Facades\Auth; use Laravel\Sanctum\Sanctum; use Kreait\Firebase\Factory; use Kreait\Firebase\Exception\Auth\FailedToVerifyToken; public function boot() { Sanctum::authenticateAccessTokensUsing(function ($bearerToken) { // 初始化Firebase Auth实例(可提前注册到服务容器做单例优化) $firebaseAuth = (new Factory()) ->withServiceAccount(env('FIREBASE_CREDENTIALS')) ->createAuth(); try { // 直接调用Firebase方法校验idToken合法性 $verifiedToken = $firebaseAuth->verifyIdToken($bearerToken); $firebaseUid = $verifiedToken->claims()->get('sub'); // 按需关联本地users表用户,不需要存储用户可跳过该步直接返回自定义用户实例 $user = \App\Models\User::where('firebase_uid', $firebaseUid)->first(); if (!$user) { return false; } Auth::setUser($user); return $user; } catch (FailedToVerifyToken $e) { // 令牌过期、签名无效等校验失败场景直接返回false return false; } }); }
步骤2:配置认证守卫
打开config/auth.php,将API守卫的驱动设置为Sanctum:
'guards' => [ 'api' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ],
步骤3:路由使用
在需要认证的API路由上添加auth:sanctum中间件即可,前端请求时携带Authorization: Bearer <firebase签发的idToken>请求头即可完成认证。
Route::group(['middleware' => 'auth:sanctum'], function () { // 你的业务API路由 Route::get('/user/profile', function () { return request()->user(); }); });
可选优化
- 将Firebase Auth实例注册到服务容器作为单例,避免每次校验都重新初始化实例,提升接口性能
- 如果完全不需要本地用户存储,可直接返回自定义的无持久化用户实例,不需要操作任何数据库表
内容的提问来源于stack exchange,提问作者zenzenzenone
相关产品推荐
相关产品推荐

