如何在Flutter中禁用Firebase手机认证(OTP)的验证码?
解决Firebase手机认证无法移除reCaptcha的问题
关键排查步骤
Firebase手机认证移除reCaptcha的核心是确保Play Integrity API验证完全通过,以下是你可能遗漏的细节:
1. 确认Play Integrity API的配置
- 检查Google Cloud控制台,确保你的Firebase项目所有关联账号都启用了Play Integrity API,别漏了共享权限的账号。
- 限制API密钥:把项目的API密钥设置为仅允许
Play Integrity API和Firebase Authentication调用,同时绑定你的应用包名、SHA-1和SHA-256指纹。
2. 同步Firebase应用配置
- 重新下载
google-services.json替换项目里的旧文件,配置更新后本地文件经常没同步最新的Play Integrity关联信息。 - 打开
google-services.json确认里面有play_integrity字段,且对应的api_key是你刚配置好限制的密钥。
3. 代码依赖与适配
- 升级Firebase Auth依赖到22.0.0版本以上,这个版本开始全面用Play Integrity替代SafetyNet,旧版本可能不兼容。
- 移除所有手动指定SafetyNet的代码,比如:
Firebase会自动适配Play Integrity,不需要额外指定。// 删掉这类旧代码 val options = PhoneAuthOptions.newBuilder(auth) ... .setVerificationCompleted(SafetyNetVerificationProvider()) .build()
4. 测试环境的特殊要求
- 模拟器:必须用带完整Google Play服务的系统镜像(选带"Google Play"标识的镜像,不是纯Android或仅Google Play Services的版本),否则Play Integrity验证过不了。
- 真机:确保设备的Google Play服务是最新版,而且测试用的APK/AAB是用Firebase配置里对应SHA指纹的签名文件打包的(Debug签名也可以,只要指纹匹配)。
5. 主动验证Play Integrity状态
加一段测试代码,确认你的应用能正常通过Play Integrity验证,方便定位问题:
val integrityManager = IntegrityManagerFactory.create(context) val request = IntegrityTokenRequest.builder().build() integrityManager.requestIntegrityToken(request) .addOnSuccessListener { tokenResponse -> Log.d("PlayIntegrity", "验证通过,Token: ${tokenResponse.token()}") } .addOnFailureListener { e -> Log.e("PlayIntegrity", "验证失败", e) // 这里的错误信息会直接告诉你原因,比如指纹不匹配、API没启用等 }
6. 检查Firebase Auth的安全设置
登录Firebase控制台,进入Authentication > 设置 > 手机认证,在"安全设置"里确认风险评估是"使用Play Integrity API进行设备验证",别开强制reCaptcha的选项。
内容的提问来源于stack exchange,提问作者Mohammad Khan Awan
相关产品推荐
相关产品推荐

