Firebase v9(beta) Auth捕获错误无credential属性 同邮箱账号关联问题
这是Firebase v9版本的官方破坏性变更,不属于你的操作疏漏。
从v9开始,auth/email-already-in-use、auth/account-exists-with-different-credential这类账号冲突错误,不再直接在error根对象挂载credential属性,相关参数都被移到了customData._tokenResponse字段下,你需要手动提取参数重新构建第三方登录凭证。
具体实现方案
- 第一步:根据错误返回的
providerId判断当前待关联的第三方登录方式,你示例中的场景是Facebook登录,所以使用FacebookAuthProvider构建凭证 - 第二步:从
error.customData._tokenResponse中提取第三方授权凭证,Facebook登录只需要用到oauthAccessToken字段 - 第三步:先引导用户使用该邮箱已绑定的原有账号(你场景中的Google账号)完成登录,再调用关联方法绑定新的凭证
示例代码
import { FacebookAuthProvider, getRedirectResult, linkWithCredential, UserCredential } from "firebase/auth"; getRedirectResult(auth) .then((userCredential: UserCredential | null) => { // 原有业务逻辑 }) .catch(async (error) => { if (error.code === 'auth/email-already-in-use') { const tokenRes = error.customData._tokenResponse; // 构建Facebook登录凭证 const newCredential = FacebookAuthProvider.credential(tokenRes.oauthAccessToken); /* 此处插入业务逻辑:提示用户该邮箱已注册,引导用户使用原有已绑定的账号(如Google)登录 拿到原有账号登录成功后的UserCredential对象:existingUserCred */ // 关联新老账号 await linkWithCredential(existingUserCred.user, newCredential); } })
补充说明
如果遇到的是其他第三方provider的账号冲突,只需要替换对应provider的凭证构造方法即可,比如Google登录就用GoogleAuthProvider.credential(tokenRes.oauthIdToken)。
内容的提问来源于stack exchange,提问作者sjbuysse
相关产品推荐
相关产品推荐

