Laravel API集成Firebase Token认证替代JWT的技术实现咨询
嘿,我刚好折腾过类似的需求,把Firebase Token集成到Laravel里,实现和jwt-auth中间件一样的认证效果,给你一步步拆解:
首先得把Firebase的PHP工具包装到Laravel项目里,运行这个命令:
composer require kreait/firebase-php kreait/firebase-tokens
接下来去Firebase控制台下载你的服务账号JSON文件(就是那个包含私钥的文件),把它放到Laravel的storage/app目录下,比如命名为firebase-service-account.json。
然后可以在config目录下新建一个firebase.php配置文件,内容大概是这样:
<?php return [ 'credentials' => storage_path('app/firebase-service-account.json'), ];
这样Laravel就能加载到Firebase的认证配置了。
因为要和jwt-auth的中间件用法保持一致,我们自己写一个中间件来处理Firebase Token的验证。运行命令生成中间件:
php artisan make:middleware AuthenticateWithFirebaseToken
打开生成的app/Http/Middleware/AuthenticateWithFirebaseToken.php,把handle方法改成这样:
public function handle(Request $request, Closure $next) { // 从请求头里获取Bearer Token,和jwt-auth的方式一样 $token = $request->bearerToken(); if (!$token) { return response()->json(['message' => 'Unauthorized'], 401); } try { // 用Firebase SDK验证Token的合法性 $verifiedToken = app('firebase.jwt')->verifyIdToken($token); $uid = $verifiedToken->getClaim('sub'); // 这里根据Firebase的uid找你Laravel数据库里的用户 // 如果是首次登录的第三方用户,可以自动创建账号 $user = User::firstOrCreate( ['firebase_uid' => $uid], ['name' => $verifiedToken->getClaim('name'), 'email' => $verifiedToken->getClaim('email')] ); // 把用户登录到Laravel的Auth系统里 Auth::login($user); return $next($request); } catch (\Exception $e) { return response()->json(['message' => 'Invalid or expired token'], 401); } }
这里的逻辑和jwt-auth类似:验证Token,找到/创建用户,然后让用户通过认证。
打开app/Http/Kernel.php,在$routeMiddleware数组里加一行:
'firebase.auth' => \App\Http\Middleware\AuthenticateWithFirebaseToken::class,
现在你就可以在路由里直接用这个中间件了,比如:
Route::get('/api/protected', function () { return response()->json(['user' => Auth::user()]); })->middleware('firebase.auth');
完全和你之前用jwt.auth的方式一样!
前端用Firebase Auth完成谷歌/推特登录后,获取到ID Token,然后在请求API的时候,把Token放到请求头里:
// 假设你已经通过Firebase Auth拿到了user对象 const token = await user.getIdToken(); // 给HTTP请求加Authorization头 this.http.get('/api/protected', { headers: new HttpHeaders().set('Authorization', `Bearer ${token}`) });
这和你之前传JWT Token的方式完全一致,前端几乎不用改太多代码。
- 记得处理Token过期的情况:Firebase的ID Token默认有效期是1小时,前端可以监听Token过期事件,自动刷新Token。
- 如果需要和原来的jwt-auth共存,可以在路由里根据需求选择不同的中间件,或者写一个统一的中间件兼容两种Token。
- 数据库里要给User表加个
firebase_uid字段,用来关联Firebase的用户ID。
内容的提问来源于stack exchange,提问作者Franco

