Firebase staging部署如何获取并记录登录失败尝试的IP等相关信息?
针对Firebase Staging环境异常密码重置请求的信息采集方案
1. 客户端登录页前置埋点
- 在前端登录/密码重置页面的提交逻辑中新增前置拦截层,用户点击提交密码重置请求时,先采集客户端公网IP、User-Agent、请求时间戳、输入的完整邮箱字段,先上报到你自己的日志存储(比如独立的Firestore日志集合、自建日志系统)后再向Firebase Auth发起正式请求
- 公网IP可通过前端调用公共IP查询接口获取,不需要依赖外部跳转服务,采集到的信息可直接关联后续的请求结果
2. 云函数拦截Auth请求全量记日志
放弃前端直接调用Firebase原生sendPasswordResetEmail接口的方案,改为所有密码重置请求先触发你自定义的HTTPS云函数,在云函数中完成日志记录后再转发请求到Firebase Auth服务,可获取到最完整的请求元数据:
const { getAuth } = require("firebase-admin/auth"); const admin = require("firebase-admin"); admin.initializeApp(); exports.handlePasswordReset = functions.https.onCall(async (data, context) => { // 直接获取请求的核心溯源信息 const requestIP = context.ip; const userAgent = context.rawRequest.headers["user-agent"]; const targetEmail = data.email; const requestTime = new Date().toISOString(); // 全量写入日志,无论用户是否存在都留痕 await admin.firestore().collection("password_reset_attempts").add({ ip: requestIP, ua: userAgent, email: targetEmail, time: requestTime, is_valid_user: false // 后续可补全是否为合法用户的标记 }); // 再调用Firebase原生的密码重置接口 try { await getAuth().generatePasswordResetLink(targetEmail); return { success: true }; } catch (e) { // 捕获用户不存在等错误,也可以在日志中更新标记 return { success: false, error: e.code }; } });
- 该方案可以覆盖所有密码重置请求,不管目标账户是否存在,都能提前记录完整的溯源信息,不会出现请求失败无日志的问题。
3. 开启Firebase Hosting访问日志导出
- 你部署在
staging.firebaseapp.com的站点可以开启Firebase Hosting的日志导出功能,所有访问请求、接口调用请求的全量信息都会同步到Google Cloud Logging中,你可以直接筛选调用Firebase密码重置接口(路径前缀为/v1/accounts:sendOobCode)的请求,直接提取对应的IP、请求参数、User-Agent等信息,不需要修改业务代码即可回溯历史请求记录。
补充防护建议
- 在密码重置请求前新增图形验证码校验,拦截自动化批量枚举请求
- 配置规则限制单个IP单位时间内的密码重置请求次数,超过阈值直接拦截
内容的提问来源于stack exchange,提问作者t1f
相关产品推荐
相关产品推荐

