Vue/Quasar 环境下 Firebase Auth 未填充 providerData 数组问题咨询
问题:Firebase 认证成功后 user.providerData 数组为空,仅重载页面后才填充
我在 VueJS / QuasarJS 应用中搭配使用 firebase-js-sdk 和 firebaseui-web 实现身份认证功能。
在通过任意配置的登录提供方(如密码、Google、Apple 等)完成认证后,我需要校验用户使用的登录渠道。但认证成功后立即查询,本应存储对应信息的 user.providerData[] 数组为空。
但重载应用后,user.providerData[] 数组会突然被正确填充数据。
我使用如下代码获取用户数据:
import { getAuth } from "firebase/auth"; const auth = getAuth(); const user = auth.currentUser; if (user) { console.log(user.providerData) }
执行代码后 user 对象其他属性均已完整填充(包括认证令牌等),但 user.providerData[] 数组为空,仅在执行页面重载(CTRL-R)后才会被填充数据。
我检索了两个项目的 issue 页面和官方文档,未找到能解释该现象的相关内容。
恳请各位提供排查方向,万分感谢!
补充说明
按照网友建议,我使用 onAuthStateChanged 监听用户状态变更:
onAuthStateChanged( fbAuth, (user) => { if (user) { console.log("onAuthStateChanged: user found"); console.log("onAuthStateChanged: user.providerData", user.providerData); console.log("onAuthStateChanged: user", user); } else { console.log("onAuthStateChanged: no user found"); } }, function (error) { console.log("onAuthStateChanged:", error); } );
但即便在认证完成后等待数分钟,user.providerData 数组仍仅在页面重载后才会被填充。
我使用的依赖版本如下:
"firebase": "9.6.1", "firebaseui": "6.0.0",
解决方案
这是 firebase 9.6.1 版本的已知缺陷,核心原因是该版本在用户首次登录完成、用户对象初始化流程中,未将 providerData 的写入逻辑与 onAuthStateChanged 的触发时机做同步,导致回调触发时 providerData 还未完成写入,只有页面重载后从本地缓存读取完整用户信息时才能拿到正常数据。
你可以按以下优先级修复:
- 优先升级 firebase 版本到 9.6.2 及以上,该问题在后续小版本更新中已经被官方修复,升级后无需修改业务代码即可正常读取 providerData 数据
- 如果暂时无法升级版本,可以在
onAuthStateChanged拿到用户对象后,手动调用user.getIdTokenResult(true)强制刷新用户令牌,触发用户信息全量更新后再读取 providerData 即可,示例代码如下:
onAuthStateChanged(fbAuth, async (user) => { if (user) { // 强制刷新令牌触发用户信息全量更新 await user.getIdTokenResult(true); console.log(user.providerData) // 此时可获取到完整数据 } })
- 临时适配可以直接从 firebaseui 的登录成功回调中获取当前登录的提供方信息,无需等待用户对象更新。
内容的提问来源于stack exchange,提问作者perelin
相关产品推荐
相关产品推荐

