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
相关产品推荐
相关产品推荐

