如何限制Firebase仅向已注册手机号发送手机号验证短信?
可以实现,核心思路是不要把短信发送的触发逻辑完全放在客户端,要加一层服务端校验逻辑,避免客户端直接调用Firebase客户端SDK发送短信的接口被滥用。
具体实现步骤
1. 调整触发入口,禁用客户端直接发验证码权限
- 首先修改现有前端逻辑,禁止前端直接调用Firebase客户端SDK的
signInWithPhoneNumber等发送验证码的原生接口,把短信发送的触发请求统一转发到你自己的服务端处理。 - 这一步是核心前提,直接在客户端触发发送的场景下无法做注册状态校验,还容易被恶意用户抓包调用刷短信。
2. 服务端先校验手机号注册状态
服务端收到前端的验证码发送请求后,先调用Firebase Admin SDK的接口查询该手机号是否对应已注册的存量用户,只有校验通过才触发短信发送。
示例代码(Node.js环境参考):
const admin = require('firebase-admin'); // 需提前完成Firebase Admin SDK的初始化配置 async function isPhoneRegistered(phoneNumber) { try { await admin.auth().getUserByPhoneNumber(phoneNumber); // 查到对应用户,说明是已注册存量用户 return true; } catch (error) { if (error.code === 'auth/user-not-found') { // 无对应用户,属于未注册手机号 return false; } throw error; } }
3. 完成后续验证流程
- 服务端确认手机号已注册后,调用Firebase Admin SDK对应的短信发送接口触发验证码下发,同时把Firebase返回的验证会话标识返回给前端。
- 前端收到用户输入的验证码后,携带会话标识和验证码调用Firebase验证接口完成登录即可,后续逻辑和原有客户端验证流程一致,不需要大幅改动。
额外防滥用优化建议
- 可在服务端加请求频率限制,同一个手机号1分钟内仅允许请求1次验证码,单日请求上限可设置为3-5次,进一步降低被恶意刷取的风险。
- 必要时可在前端增加人机校验(比如滑块验证、文字点选验证),校验通过后才允许发起发送验证码的请求。
内容的提问来源于stack exchange,提问作者Aren
相关产品推荐
相关产品推荐

