升级@react-native-firebase/auth至12.8.0后短信验证码随机过期问题
核心原因排查与修复方案
1. Play商店版本全失败的根因修复
你添加的release环境SHA是本地打包密钥的签名值,但如果你的应用开启了Google Play应用签名服务,Play商店会用谷歌官方的签名密钥重新对你的安装包签名,此时本地的release SHA不生效,会触发Firebase身份校验失败,直接出现session过期报错:
- 打开Google Play Console,进入对应应用的「设置 > 应用完整性 > 应用签名」页面
- 复制「应用签名密钥证书」分类下的SHA256值,添加到Firebase控制台项目设置的对应Android应用配置中
- 重新下载
google-services.json替换项目内的旧文件,重新打包上架即可
2. 版本升级带来的自动验证逻辑兼容问题
@react-native-firebase/auth从v12.5.0版本开始调整了短信验证的默认逻辑,新增了自动短信检索功能:如果设备的谷歌服务成功读取到验证码短信,会自动完成身份校验,此时你存在状态中的confirm对象会直接失效,用户再手动输入验证码调用confirm()就会返回session过期报错,这也是你部分场景失败、部分场景成功的核心原因。
两种修复方案二选一即可:
- 保留自动验证功能:添加
auth().onAuthStateChanged()监听,当监听到用户登录成功的回调时,直接跳过手动输码步骤,跳转至后续业务页面 - 关闭自动验证功能:调用
signInWithPhoneNumber时传入第三个参数关闭自动验证,完全走手动输码逻辑,代码调整如下:
async function signInWithPhoneNumber() { console.log('Inside the Phone Number +91', registration_id); try { // 第三个参数设为true,关闭自动短信验证 const confirmation = await auth().signInWithPhoneNumber( '+91' + registration_id, undefined, true ); setConfirm(confirmation); } catch (_error) { console.log(_error); } }
3. 代码逻辑隐患修复
你提供的代码中confirm、result、uid未声明作用域,大概率是全局变量或者未正确用状态管理:
- 建议将
confirm对象存入useState中,避免页面重渲染、应用切后台再切回时变量丢失,调用了已经失效的旧confirm对象 - 补充重发验证码逻辑,用户点击重发时,将上一次
confirmation对象的verificationId作为forceResendingToken传给signInWithPhoneNumber,避免生成多份有效session导致旧session失效
4. Safety Net 校验兼容
v12.8.0版本默认启用了Safety Net校验,部分没有安装谷歌服务、或者过不了Safety Net校验的设备会触发验证失败:
- 可以先在
android/app/src/main/AndroidManifest.xml中添加配置关闭Safety Net校验测试是否恢复正常:
<meta-data android:name="firebase_auth_phone_verification_enable_safetynet" android:value="false" />
- 若需要保留Safety Net功能,去Firebase控制台「身份验证 > 设置 > Safety Net」页面确认所有环境的SHA256都已经正确添加
所有修改完成后,先打本地release包测试全场景验证通过后,再上架Play商店即可。
内容的提问来源于stack exchange,提问作者Akash Waghule
相关产品推荐
相关产品推荐

