You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase手机号认证针对伊拉克号码返回503 Service Unavailable错误的问题求助

Firebase手机号认证针对伊拉克号码返回503 Service Unavailable错误的问题求助

我在自己的Web应用中使用Firebase手机号认证功能,目前遇到了一个非常棘手的问题:测试号码以及埃及(+20)等其他国家的真实手机号都能正常完成OTP发送和认证流程,但所有伊拉克地区(+964)的真实手机号都会持续返回503 Service Unavailable错误,完全无法触发OTP发送。

核心代码实现

以下是我处理OTP发送流程的核心逻辑,包含了reCAPTCHA重试机制、格式校验和健康检查:

const setupRecaptcha = async () => {
  try {
    return await resetRecaptchaWithRetry(auth, "recaptcha-container", 3);
  } catch (error) {
    console.error("reCAPTCHA setup failed after retries:", error);
    throw error;
  }
};

const handleSendOTP = async (phoneNumber) => {
  if (!phoneNumber) {
    message.error(t("auth.phone_number_missing"));
    return;
  }

  // 首次请求前运行Firebase健康检查
  if (!window.firebaseHealthChecked) {
    console.log("Running Firebase health check...");
    await firebaseHealthCheck();
    window.firebaseHealthChecked = true;
  }

  // 验证手机号格式有效性
  const phoneTest = testPhoneNumber(phoneNumber);
  console.log("Phone number test result:", phoneTest);

  // 检查reCAPTCHA容器是否存在
  const recaptchaContainer = document.getElementById("recaptcha-container");
  if (!recaptchaContainer) {
    console.error("reCAPTCHA container not found in DOM");
    message.error(t("auth.recaptcha_missing"));
    return;
  }

  try {
    setIsLoading(true);
    console.log("Starting OTP send process...");

    // 带重试机制初始化reCAPTCHA验证器
    const verifier = await setupRecaptcha();
    console.log("reCAPTCHA setup completed successfully");
    if (!verifier) {
      message.error(t("auth.recaptcha_missing"));
      return;
    }

    // 发送OTP请求
    console.log("Sending OTP to formatted number:", phoneTest.formatted);
    const confirmationResult = await signInWithPhoneNumber(
      auth,
      phoneTest.formatted,
      verifier
    );

    // 成功后更新UI状态
    window.confirmationResult = confirmationResult;
    setIsOTPSent(true);
    setTimer(300); // 重置为5分钟倒计时
    setIsExpired(false);
    setRecaptchaRetryCount(0);
    message.success(t("auth.otp_sent"));
    console.log("OTP sent successfully");
  } catch (error) {
    console.error("Error occurred in OTP send flow:", error);
    // 错误时清理reCAPTCHA状态
    clearRecaptcha();
    // 省略后续错误提示UI逻辑
  } finally {
    setIsLoading(false);
  }
};

请求Payload示例

触发错误时的请求Payload内容如下(已脱敏token部分):

{
  "phoneNumber": "+9647736313833",
  "clientType": "CLIENT_TYPE_WEB",
  "captchaResponse": "NO_RECAPTCHA",
  "recaptchaToken": "[long-token-string]",
  "recaptchaVersion": "RECAPTCHA_ENTERPRISE"
}

已完成的排查步骤

我已经做了多轮排查,排除了大部分代码层面的问题:

  • ✅ 测试号码正常:伊拉克格式的Firebase官方测试号码可以正常接收OTP
  • ✅ 其他地区号码正常:埃及(+20)、东南亚等多个国家的真实手机号都能完成全流程认证
  • ✅ reCAPTCHA配置无误:容器存在、初始化正常,没有出现验证失败的情况
  • ✅ 手机号格式合法:testPhoneNumber函数已确认伊拉克号码的格式为标准的+964xxxxxxxxx格式
  • ✅ Firebase健康检查通过:首次请求前运行的健康检查未发现服务连通性问题

环境信息

  • Firebase SDK版本:最新稳定版
  • 运行平台:Web(纯JavaScript实现)
  • 认证方式:手机号OTP认证
  • 触发错误的固定返回:503 Service Unavailable
  • 受影响唯一地区:伊拉克(国家码+964)

我目前倾向于认为这是Firebase的区域基础设施问题,因为完全相同的代码逻辑在其他地区都能稳定运行,只有伊拉克地区的真实号码会触发503错误。有没有遇到过类似问题的开发者?或者有没有其他我没考虑到的排查方向可以推荐?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:33:07