近日,多位 Firebase 开发者报告了一个令人困惑的身份验证异常:在移动端或桌面端使用 signInWithRedirect() 方法进行 Google、Facebook 等第三方登录时,用户被重定向到身份提供商并成功授权,返回应用后却始终无法创建 Firebase Authentication 用户对象,导致应用无法识别登录状态。但神奇的是,改用 signInWithPopup() 弹出窗口方式登录,一切流程完全正常。

这一现象已在 GitHub 社区、Stack Overflow 及 Firebase 官方论坛引发广泛讨论,涉及 React、Vue、原生 JavaScript 等多种前端框架,以及 Chrome、Safari、Android WebView 等多个环境。开发者表示,该问题在最近几个版本中突然出现,且严重影响依赖重定向登录的生产环境应用。

问题重现:重定向后“静默失败”

多位开发者描述了完全一致的复现步骤:调用 signInWithRedirect(auth, provider) 后,浏览器正常跳转至 Google 或 Facebook 登录页,用户完成授权并点击“允许”,页面按预期返回原始应用。此时,应用已正常加载,但调用 onAuthStateChanged 监听器始终不触发,auth.currentUser 返回 null,Firebase 控制台中也看不到新创建的用户记录。换句话说,授权流程在“最后一步”断开了。

“用户明明已经授权,但 Firebase 就是认为他们还没登录。更奇怪的是,没有任何错误抛出,也没有网络请求失败。”一位昵称为 @webdev_jenny 的开发者写道。

为何 popup 正常,redirect 却失效?

这两种方法的核心区别在于用户授权流程的页面控制方式。

  • signInWithPopup():在单页应用(SPA)中弹出一个新窗口或新标签页完成授权,完成后自动关闭窗口,主页面 JavaScript 环境保持不变,OAuth 回调通过 postMessagewindow.opener 传递。
  • signInWithRedirect():整个应用页面被重定向到身份提供商,授权完成后通过指定的回调 URL(通常是应用域名)返回,此时应用完全重新加载,Firebase 需要从 URL 参数或本地存储中恢复授权凭证。

理论上,redirect 方式更适合移动端或禁用弹窗的环境。但目前的 Bug 表明,Firebase Auth 库在重定向返回后的“凭证恢复”环节存在严重问题。社区分析认为,可能的原因包括:

  1. 第三方 Cookie 限制:Safari 和 Chrome 的 SameSite 策略以及 ITP(智能防跟踪)导致缓存授权结果的 iframe 无法正常访问,使 signInWithRedirect 依赖的本地状态丢失。
  2. Firebase Auth SDK 内部索引键冲突:有开发者通过调试发现,重定向返回后 Firebase 试图从 sessionStorage 中读取 firebase:redirectUser 键,但该键在最新版本中可能被错误覆盖或未正确写入。
  3. authStateReady() 未正确处理:部分用户尝试手动调用 authStateReady() 等待状态初始化,但监听器依然没有反应。

官方沉默,社区自救

截至发稿,Firebase 官方尚未发布针对该问题的官方声明或修复补丁。不过在 GitHub Issues 中,少数 Firebase 工程师回应表示“正在调查”,并建议遇到问题的开发者先临时改用 signInWithPopup()

但很多生产环境应用无法简单切换——例如在 iOS SFSafariViewController 或 Android Custom Tabs 中,弹窗方式被严格限制,必须使用重定向。此外,部分企业安全策略也要求必须使用完全重定向登录。

社区中流传的临时解决方案包括:

  • 降低 Firebase JS SDK 版本:回退到 9.x8.x 的旧版本,部分开发者报告 v8.10.0 之前正常。
  • 手动清除 sessionStorage 缓存:在应用加载时添加 removeItem 清理旧的 redirect 状态。
  • 使用 signInWithRedirect() 后配合 getRedirectResult() 显式获取结果:虽然大多数情况仍返回 null,但个别场景可恢复用户对象。
  • 改用自定义 OAuth 流程:绕过 Firebase 封装,直接调用 Identity Platform REST API。

建议与展望

对于正在开发或维护 Firebase 认证模块的开发者,建议:

  1. 优先使用 signInWithPopup(),除非明确需要支持禁止弹窗的环境。
  2. 如果必须使用 redirect,降级 SDK 版本并添加容错处理,例如在回调失败后提示用户重新尝试。
  3. 密切跟踪 GitHub Issue [#XXXXX](Firebase JS SDK 仓库中相关议题),一旦官方发布修复版本及时升级。
  4. 考虑迁移到 Firebase Auth Emulator 以离线测试重定向流程,但需注意模拟器行为与生产环境仍有差异。

Firebase Authentication 是 Google 云生态中部署最广泛的服务之一,此次重定向登录的 Bug 直接影响数万个应用的登录转化率。希望 Google 团队能尽快定位根因,为开发者提供一个稳定的解决方案。在此之前,建议各位开发者做好降级预案,避免因用户授权失败导致流失。