Firebase Admin身份验证不发送短信直接创建用户,如何先完成手机号验证?
解决方案
你现在收不到验证短信是因为Firebase Admin SDK的auth.create_user()接口默认信任你传入的手机号真实性,不会主动触发验证短信发送,Admin SDK本身也没有直接发送手机号验证短信的开放接口。
推荐实现流程
你需要调整整体实现逻辑,前置手机号验证步骤到客户端侧,完整流程如下:
- 前端(Web/安卓/iOS)集成对应平台的Firebase客户端SDK,用户提交手机号后,前端调用客户端的手机号验证接口触发短信发送
- 用户收到短信后输入验证码,前端完成验证码校验,拿到验证通过后的ID令牌
- 前端将ID令牌和其他注册信息提交到你的Python后端
- 后端先校验ID令牌的合法性,确认手机号已经完成验证后,再调用
auth.create_user()创建用户
现有代码优化点
你的当前代码有一个明显错误:firebase_admin.initialize_app(cred) 不能放在接口函数内部,每次请求都会触发重复初始化,直接抛出报错,需要把这部分逻辑挪到项目启动的全局初始化位置,只执行一次。
后端校验+创建用户示例代码
from rest_framework.decorators import api_view, renderer_classes from rest_framework.renderers import JSONRenderer, TemplateHTMLRenderer import firebase_admin from firebase_admin import credentials from firebase_admin import auth # 全局初始化,项目启动时执行一次即可 cred = credentials.Certificate('PhoneNumberVerify/firebase-admin.json') firebase_admin.initialize_app(cred) @api_view(('POST',)) @renderer_classes((TemplateHTMLRenderer, JSONRenderer)) def CreateUserView(request): # 前端传过来的验证通过后的ID令牌 id_token = request.data.get('id_token') try: # 校验令牌合法性,同时可以拿到验证过的手机号 decoded_token = auth.verify_id_token(id_token) verified_phone = decoded_token.get('phone_number') # 确认手机号已验证 if not decoded_token.get('phone_verified', False): return {"code": 400, "msg": "手机号未验证"} # 创建用户 user = auth.create_user(phone_number=verified_phone) return {"code": 200, "msg": "用户创建成功", "uid": user.uid} except Exception as e: return {"code": 400, "msg": f"校验失败: {str(e)}"}
可选方案:后端自主控制验证流程
如果不想依赖Firebase客户端的验证逻辑,也可以走自定义流程:
- 后端收到用户提交的手机号后,生成6位随机验证码,调用第三方短信服务商的接口发送验证码
- 将手机号和验证码的对应关系存入Redis等缓存,设置5-10分钟有效期
- 用户提交验证码后,后端先比对缓存中的验证码是否匹配,匹配通过后再调用
auth.create_user()创建用户,同时可以手动标记手机号已验证:
user = auth.create_user( phone_number=phone, phone_verified=True # 自己验证过的话可以直接标记为已验证 )
内容的提问来源于stack exchange,提问作者MIike Eps
相关产品推荐
相关产品推荐

