如何修改Firebase删除账户函数以适配Google账号登录用户?
解决Firebase Auth兼容邮箱密码/Google登录账户删除的问题
你的问题很典型——因为Google登录的用户本身就没有设置密码,你硬要用EmailAuthProvider.credential去做重新认证,自然会抛出wrong-password错误。要解决这个问题,核心是先判断用户的登录认证类型,再用对应方式完成重新认证。
问题根源
Firebase Auth中,不同登录方式的用户,重新认证的规则完全不同:
- 邮箱密码登录的用户:需要验证密码
- Google登录的用户:需要重新通过Google OAuth授权获取凭证,而不是密码
你的代码只处理了第一种情况,没有兼容Google登录的场景,所以会报错。
修改后的完整代码(用async/await优化可读性)
const deleteUserAccount = async () => { const auth = firebase.auth(); const currentUser = auth.currentUser; if (!currentUser) return; // 先判断用户是否已登录 try { // 1. 获取用户的认证提供者类型 const providerId = currentUser.providerData[0].providerId; // 2. 根据不同认证类型做重新认证 if (providerId === 'password') { // 邮箱密码用户:用密码重新认证 const credential = firebase.auth.EmailAuthProvider.credential( currentUser.email, reEnterPassword // 用户输入的密码 ); await currentUser.reauthenticateWithCredential(credential); } else if (providerId === 'google.com') { // Google登录用户:弹出Google登录弹窗重新获取凭证 const provider = new firebase.auth.GoogleAuthProvider(); const result = await auth.signInWithPopup(provider); const credential = result.credential; await currentUser.reauthenticateWithCredential(credential); } // 3. 先删除Firestore用户文档,再删除Auth账户 await firebase.firestore().collection("users").doc(currentUser.uid).delete(); await currentUser.delete(); // 这里可以加删除成功后的逻辑,比如跳转到登录页 } catch (error) { console.error('删除账户失败:', error); // 可以在这里给用户展示错误提示,比如密码错误、Google授权失败等 } };
关键优化点说明
- 判断认证类型:通过
currentUser.providerData[0].providerId获取用户的登录来源,常见值有password(邮箱密码)、google.com(Google登录)、facebook.com等 - Google重新认证逻辑:必须通过
signInWithPopup或signInWithRedirect让用户再次授权Google,拿到新的凭证后才能完成重新认证,这是Firebase的安全规则要求 - Promise扁平化:用
async/await替代多层嵌套的then/catch,代码可读性大幅提升 - 统一错误处理:所有错误都在最外层的
catch中处理,避免重复写错误日志逻辑 - 前置判断:先检查
currentUser是否存在,避免未登录时执行报错
内容的提问来源于stack exchange,提问作者KLG
相关产品推荐
相关产品推荐

