有没有办法在电容器中保持Firebase Auth状态?

问题描述

我正在开发离子/反应/电容器应用程序。 应用启动时,我正在调用firebase.auth()。setPersistence(firebase.auth.Auth.Persistence.LOCAL)。

在浏览器中一切正常。但是,在部署后,重新启动应用程序时身份验证状态不会保留。 我最初以为Capacitor可能不支持IndexedDB / Local Storage,但是即使安装了Microsoft的IndexedDB Cordova插件https://github.com/microsoft/cordova-plugin-indexedDB,它仍然无法正常工作(我假设该插件与电容器兼容)。

有什么办法可以使它正常工作,还是我必须自己保留身份验证状态?

解决方法

在启动时,您需要检查是否存在现有的经过身份验证的用户...

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var displayName = user.displayName;
    var email = user.email;
    var emailVerified = user.emailVerified;
    var photoURL = user.photoURL;
    var isAnonymous = user.isAnonymous;
    var uid = user.uid;
    var providerData = user.providerData;
    // ...
  } else {
    // User is signed out.
    // ...
  }
});

https://firebase.google.com/docs/auth/web/start

,

我遇到了类似的问题 - 身份验证状态未持久化的原因可能有几个 - 但很可能是因为 Firebase SDK 无法使用 refreshToken 刷新您的 idToken。

  1. 转到 Google Cloud 控制台检查 API 密钥的权限。 API 密钥需要使用令牌服务 API 和 Identity Toolkit API 的权限,以通过使用“refreshToken”刷新“idToken”。

  2. 将 Persistence 设置为“LOCAL”并不能解决问题,因为它 默认为“本地”。

  3. Firebase JS SDK 使用 IndexedDB 来存储 Refresh 键(有效期为 1 年)。如果 IndexedDB 不可用,它将使用 LocalStorage。根据 Capacitor's docs,如果设备空间不足,操作系统(Android 或 iOS)会清除 IndexedDB 和 LocalStorage。我认为这种情况很少见,因为用户没有在我的应用上退出。

  4. 如果您想移除对 IndexedDB 或 LocalStorage 的依赖,您还可以使用 Capacitor 插件将刷新令牌(在登录时获得)存储在安全的持久存储中,然后使用该令牌请求新的 idToken使用 Firebase's Authentication REST API。然后,您必须使用 onIdTokenChanged 侦听器来跟踪身份验证状态。 see here