You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:33:21