Laravel 9项目对接Firebase手机号认证可行性咨询
Laravel 9 对接 Firebase 手机号认证方案
可以实现对接,但纯PHP后端无法完成完整的手机号认证流程——Firebase手机号认证的验证码发送环节依赖客户端(前端)的reCAPTCHA验证或应用验证机制,后端仅能配合完成最终的令牌校验与Laravel用户体系的对接。
核心流程说明
Firebase手机号认证的标准流程必须分为两步:
- 前端触发验证码发送与验证,获取Firebase的ID Token
- Laravel后端验证该ID Token,同步用户数据并生成Laravel本地认证会话
具体实现步骤
1. 前端完成验证码发送与ID Token获取
使用Firebase JS SDK完成以下操作:
- 初始化Firebase SDK
- 调用
signInWithPhoneNumber发送验证码到用户手机号 - 用户输入验证码后,调用
confirmVerificationCode获取认证凭证 - 通过
user.getIdToken()获取Firebase ID Token,发送到Laravel后端接口
2. Laravel后端对接配置与实现
安装依赖
安装Firebase PHP SDK及Laravel适配包:
composer require kreait/firebase-php kreait/laravel-firebase
配置Firebase服务账号
将Firebase控制台下载的服务账号JSON文件放到项目storage/app/firebase目录下,在.env中配置路径:
FIREBASE_CREDENTIALS=storage/app/firebase/service-account.json
创建认证接口控制器
编写控制器方法验证Firebase ID Token并同步Laravel用户:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Kreait\Firebase\Auth; use Illuminate\Support\Facades\Auth as LaravelAuth; use App\Models\User; class FirebasePhoneAuthController extends Controller { public function verifyToken(Request $request) { $request->validate([ 'id_token' => 'required|string', ]); $firebaseAuth = app(Auth::class); try { // 验证Firebase ID Token $verifiedToken = $firebaseAuth->verifyIdToken($request->id_token); $firebaseUid = $verifiedToken->claims()->get('sub'); $phoneNumber = $verifiedToken->claims()->get('phone_number'); // 查找或创建Laravel用户 $user = User::firstOrCreate( ['firebase_uid' => $firebaseUid], ['phone_number' => $phoneNumber, 'name' => '用户_' . substr($phoneNumber, -4)] ); // 登录Laravel用户 LaravelAuth::login($user); // 返回Laravel认证令牌(以Sanctum为例) return response()->json([ 'user' => $user, 'access_token' => $user->createToken('PhoneAuth')->plainTextToken, 'token_type' => 'Bearer' ]); } catch (\Kreait\Firebase\Exception\Auth\InvalidIdToken $e) { return response()->json(['error' => '无效的认证令牌'], 401); } catch (\Exception $e) { return response()->json(['error' => '认证失败'], 500); } } }
配置路由
在routes/api.php中添加接口路由:
use App\Http\Controllers\Auth\FirebasePhoneAuthController; Route::post('/auth/firebase-phone/verify', [FirebasePhoneAuthController::class, 'verifyToken']);
关键说明
- 无法绕开前端:Firebase的手机号认证要求客户端提供reCAPTCHA令牌或应用验证信息,后端无法直接调用短信发送API,因此必须依赖前端完成验证码环节。
- 用户数据同步:通过Firebase ID Token中的
phone_number和sub(Firebase用户ID)字段,可在Laravel中创建或关联本地用户,实现双端用户体系的统一。
内容的提问来源于stack exchange,提问作者Velu Murugan
相关产品推荐
相关产品推荐

