Firebase Auth v9缺失AuthCredential.fromJSON()如何解析JSON凭证
Firebase Auth v9 解析JSON格式凭证为AuthCredential实例的方法
Firebase v9模块化SDK移除了全局的AuthCredential.fromJSON()静态方法,对应的反序列化能力被拆分到了各个具体认证提供商的Provider类下,按以下方式处理即可:
核心逻辑
AuthCredential实例调用toJSON()序列化后的输出,会自带providerId字段标识凭证所属的登录渠道,根据这个字段匹配对应提供商的反序列化方法,就能还原出AuthCredential实例。
各常用登录渠道对应的反序列化方法
- 邮箱密码、邮箱免密登录(providerId为
password/emailLink):调用EmailAuthProvider.credentialFromJSON() - Google登录(providerId为
google.com):调用GoogleAuthProvider.credentialFromJSON() - GitHub登录(providerId为
github.com):调用GithubAuthProvider.credentialFromJSON() - 手机号登录(providerId为
phone):调用PhoneAuthProvider.credentialFromJSON() - Facebook、Twitter、Apple等其他第三方登录:调用对应Provider类下的
credentialFromJSON()静态方法即可
实现代码示例
import { EmailAuthProvider, GoogleAuthProvider, GithubAuthProvider, PhoneAuthProvider, signInWithCredential } from "firebase/auth"; // 替换为你自己项目里初始化Firebase Auth的导入 import { auth } from "./firebase-config"; // 接收到的序列化凭证字符串,先转成对象 const credentialObj = JSON.parse(receivedSerializedCredential); let authCredential; switch (credentialObj.providerId) { case "password": case "emailLink": authCredential = EmailAuthProvider.credentialFromJSON(credentialObj); break; case "google.com": authCredential = GoogleAuthProvider.credentialFromJSON(credentialObj); break; case "github.com": authCredential = GithubAuthProvider.credentialFromJSON(credentialObj); break; case "phone": authCredential = PhoneAuthProvider.credentialFromJSON(credentialObj); break; default: throw new Error(`未适配的凭证类型: ${credentialObj.providerId}`); } // 拿到实例后即可正常完成登录 const userInfo = await signInWithCredential(auth, authCredential);
补充说明
如果你当前使用的是v9的兼容版本(导入路径带/compat后缀),可以和v8版本一样直接调用AuthCredential.fromJSON(),但兼容版本仅做过渡使用,官方长期推荐使用模块化原生写法。
内容的提问来源于stack exchange,提问作者Yairopro
相关产品推荐
相关产品推荐

