Laravel后端结合Firebase:邮箱密码登录实现方案(已用Socialite OAuth)
解决方案
要实现Firebase邮箱密码登录后的Laravel认证,核心思路是iOS端将Firebase的ID Token传给Laravel后端,后端验证Token合法性后同步用户数据并生成Laravel Passport令牌,可以完美复用你现有OAuth登录的核心逻辑。
步骤1:Laravel集成Firebase Admin SDK
首先需要在Laravel中安装并配置Firebase Admin SDK,用来验证iOS端传来的Firebase ID Token:
composer require kreait/laravel-firebase
发布配置文件:
php artisan firebase:install
将Firebase控制台下载的服务账号JSON文件放到项目根目录,然后在.env中配置:
FIREBASE_CREDENTIALS=./firebase-service-account.json FIREBASE_PROJECT_ID=你的Firebase项目ID
步骤2:修改AuthController支持Firebase邮箱密码登录
在原有login方法中,新增对firebase provider的处理分支,保持和Google/Apple登录的逻辑一致:
use Kreait\Firebase\Exception\Auth\FailedToVerifyToken; use Kreait\Laravel\Firebase\Facades\Firebase; class AuthController extends Controller { public function login(Request $request) { $validator = Validator::make($request->all(), [ 'provider_name' => 'required|string|in:google,apple,firebase', 'access_token' => 'required|string', ]); if ($validator->fails()) { Log::info($validator->errors()); return response()->json(['status' => 'error', 'message' => $validator->errors()], 422); } $providerName = $request->input('provider_name'); $token = $request->input('access_token'); $providerUser = null; // 处理不同登录提供商 switch ($providerName) { case 'google': case 'apple': $providerUser = Socialite::driver($providerName)->userFromToken($token); break; case 'firebase': try { // 验证Firebase ID Token $verifiedIdToken = Firebase::auth()->verifyIdToken($token); // 获取Firebase用户信息 $firebaseUser = Firebase::auth()->getUser($verifiedIdToken->claims()->get('sub')); $providerUser = (object)[ 'id' => $firebaseUser->uid, 'email' => $firebaseUser->email, 'name' => $firebaseUser->displayName ?? '用户', 'email_verified' => $firebaseUser->emailVerified ]; } catch (FailedToVerifyToken $e) { Log::info('Firebase Token验证失败:'.$e->getMessage()); return response()->json(['status' => 'error', 'message' => '无效的登录凭证'], 401); } break; } // 查找或创建用户(复用原有逻辑) $user = User::where('provider_name', $providerName) ->where('provider_id', $providerUser->id) ->first(); if (!$user) { $user = new User; $user->name = $providerUser->name; $user->email = $providerUser->email; $user->provider_name = $providerName; $user->provider_id = $providerUser->id; // 如果Firebase已验证邮箱,同步到Laravel if ($providerUser->email_verified) { $user->email_verified_at = now(); } $user->save(); } // 生成Laravel Passport令牌 $laravelToken = $user->createToken("token")->accessToken; return response()->json([ "status" => "success", "data" => [ "token" => $laravelToken, "user" => $user ], ]); } }
步骤3:iOS端传递Firebase ID Token
iOS端在通过Firebase完成邮箱密码登录后,获取当前用户的ID Token,然后调用Laravel的login接口,传递provider_name=firebase和access_token=Firebase的ID Token即可。
iOS端获取ID Token的示例代码(Swift):
Auth.auth().currentUser?.getIDToken(completion: { token, error in if let error = error { // 处理错误 return } guard let idToken = token else { return } // 调用Laravel登录接口,传递provider_name和idToken })
关键说明
- 所有登录方式最终都统一到查找/创建用户→生成Laravel令牌的逻辑,完全复用原有代码结构
- Firebase Token验证确保了请求的合法性,避免伪造用户数据
- 同步Firebase的邮箱验证状态,保持两端用户数据一致
内容的提问来源于stack exchange,提问作者user896541
相关产品推荐
相关产品推荐

