Firestore认证:删除匿名用户后自动重登问题的解决咨询
问题根源
你的onAuthStateChanged监听逻辑里,只要检测到user为null就自动执行signInAnonymously()。当你删除匿名用户后,Auth状态变为null,这个监听会立刻触发,在你完成手机号登录前就创建了新的匿名用户,导致后续出现ID不同的新匿名账号。
解决方案
添加一个状态标记,用来区分「正在处理其他登录方式」的场景,此时暂时禁用自动匿名登录逻辑。
步骤1:添加状态标记
在组件内部新增一个状态,标记当前是否正在处理手机号登录:
const [isProcessingLogin, setIsProcessingLogin] = useState(false);
步骤2:修改Auth状态监听逻辑
更新onAuthStateChanged,只有在没有用户且不在处理其他登录的情况下,才执行自动匿名登录:
function onAuthStateChanged(user: FirebaseAuthTypes.User | null) { console.log( "Auth State Changed... ", user?.uid, user?.phoneNumber, user?.isAnonymous, "<<App.js" ); userCurrentSet(user); // 仅当无用户且未在处理其他登录时,自动匿名登录 if (!user && !isProcessingLogin) { auth().signInAnonymously(); } if (initializing && user) { setInitializing(false); } }
步骤3:更新手机号登录逻辑
在confirmCode函数中,开始处理时标记isProcessingLogin为true,整个流程结束(无论成功或失败)后再重置为false:
const confirmCode = async () => { initilizingSet(true); setIsProcessingLogin(true); // 标记开始处理登录流程 try { if (confirm && confirm.verificationId && userCurrent) { // 尝试关联匿名账号与手机号 await userCurrent.linkWithCredential( auth.PhoneAuthProvider.credential(confirm.verificationId, pinNumber) ); } } catch (e) { console.log(e.code, "<<errCode"); if (e.code === "auth/credential-already-in-use") { try { // 删除当前匿名账号 await userCurrent.delete(); // 直接用手机号登录 await confirm.confirm(pinNumber); } catch (err) { console.log(err); } } } finally { initilizingSet(false); setIsProcessingLogin(false); // 登录流程结束,恢复自动匿名登录逻辑 } };
逻辑说明
- 当触发手机号登录时,
isProcessingLogin设为true,此时即使删除匿名账号导致Auth状态变为null,onAuthStateChanged也不会触发自动匿名登录。 - 登录流程完成(成功或失败)后,
isProcessingLogin重置为false:如果登录失败且当前无用户,onAuthStateChanged会自动触发匿名登录回到初始状态;如果登录成功,则保持已登录状态。
内容的提问来源于stack exchange,提问作者Wisam Jbori
相关产品推荐
相关产品推荐

