能否在Firebase中使用手机号代替邮箱实现无密码身份验证?
问题解答
Firebase完全支持手机号无密码验证,你当前使用的generate_sign_in_with_email_link是邮箱链接登录的专属接口,确实仅支持邮箱入参,你可以选择以下两种方案实现需求:
方案1:官方原生短信验证码登录(推荐)
这是Firebase Auth原生支持的无密码登录方式,无需自定义开发验证逻辑,实现步骤如下:
- 前端AngularJS引入Firebase Auth Web SDK,调用
signInWithPhoneNumber方法传入用户手机号和reCAPTCHA验证器,Firebase会自动向该手机号发送含6位数字验证码的短信 - 用户收到验证码后在前端输入,调用验证请求返回的
ConfirmationResult实例的confirm方法传入验证码,校验通过即可直接完成登录,全程不需要设置密码 - 如果你需要在后端校验验证码有效性,可以调用Python Admin SDK的
auth.verify_phone_number_verification_code(phone_number, code)方法,校验通过后自行处理会话逻辑即可
方案2:自定义手机号链接登录(和你现有邮箱登录逻辑完全对齐)
如果你想要和邮箱登录一致的「点击短信内链接直接登录」的交互,官方没有原生接口,但可以通过自定义逻辑实现,参考代码如下:
import uuid import redis from firebase_admin import auth # 初始化Redis存储临时token,过期时间设为15分钟 r = redis.Redis(host='localhost', port=6379, db=0) TOKEN_EXPIRE_SECONDS = 900 def generate_phone_sign_in_link(phone_number): # 生成随机唯一的一次性token sign_token = str(uuid.uuid4()) # 存储token与手机号的映射关系,到期自动失效 r.setex(sign_token, TOKEN_EXPIRE_SECONDS, phone_number) # 拼接生成登录链接 login_link = f'http://localhost:4200/phone-login?token={sign_token}' # 此处调用你对接的短信服务,将login_link发送到对应手机号即可 return login_link # 前端跳转后校验token的后端逻辑 def verify_phone_sign_token(token): phone_number = r.get(token) if not phone_number: raise Exception("登录链接无效或已过期") # 校验通过后获取对应用户,不存在则自动创建 try: user = auth.get_user_by_phone_number(phone_number) except auth.UserNotFoundError: user = auth.create_user(phone_number=phone_number) # 生成Firebase自定义登录token返回给前端 custom_token = auth.create_custom_token(user.uid) # 销毁已使用的token,防止重复调用 r.delete(token) return custom_token
前端拿到自定义token后,调用Firebase Web SDK的signInWithCustomToken(custom_token)即可完成登录。
注意事项
- 使用原生短信验证码方案时需要配置reCAPTCHA验证,防止恶意请求刷取短信
- 自定义链接方案需要保证token为单次有效且有效期不超过15分钟,避免链接泄露后被冒用
内容的提问来源于stack exchange,提问作者cuzureau
相关产品推荐
相关产品推荐

