Firebase 意外地坚持匿名身份验证,可用于 onAuthStateChanged

Firebase unexpectedly persisting anonymous auth, available with onAuthStateChanged

我一直在为 React Native 应用程序使用 Firebase 匿名身份验证,主要是为了确保用户只能 read/write 他们自己的数据(例如检查 auth && auth.uid 安全规则)

以前,使用 Firebase 2.4.2,我的身份验证方案如下:

  1. 用户注册

    firebaseRef.authAnonymously((error, authData) => {
      if (error) {
        // handle error
      } else {
        // store the token on device
        store(authData.token);
      }
    });
    
  2. 每当用户稍后打开应用程序时,使用存储的令牌创建一个会话

    firebaseRef.authWithCustomToken(storedToken, (error) => {
      if (error) {
        // handle errors
      } else {
        // proceed
      }
    });
    

Firebase 2.4.2 中匿名身份验证返回的令牌似乎适用于自定义身份验证。

升级到 Firebase 3.1 后,此流程不再有效——具体来说,尝试使用 signInAnonymously 生成的令牌创建 signInWithCustomToken 会话 returns 错误 auth/invalid-custom-token.

但是,没有持久会话的问题似乎已经消失了。现在,使用 Firebase 3.1:

  1. 用户注册

    firebase.auth().signInAnonymously().then(user => {
      // store token
      user.getToken().then(token => store(token))
    });
    
  2. 每当用户稍后打开应用程序时,会话仍然可用并调用此侦听器

    firebase.auth().onAuthStateChanged(user => {
      // user is still authenticated
    });
    

我不清楚这是如何工作的,Firebase 如何保持会话?

在 Firebase 2.x 版本 JavaScript SDK 身份验证适用于 React Native,但会话信息不会在运行之间的任何地方保留。这样做的原因是本地存储(Firebase 用于在浏览器中保存此信息)在 React Native 中不可用。

在 Firebase 的 3.0 版中 JavaScript SDK 身份验证不再适用于 React Native。

从 Firebase 的 3.1 版开始 JavaScript SDK 身份验证再次适用于 React Native。会话详细信息保存在 React Native's Async Storage.