当身份验证“加载”完成时,Firebase进行监听

时间:2019-08-06 20:30:04

标签: javascript firebase firebase-authentication

我正在尝试实现以下流程:
1.等待应用加载
2.检查用户是否存在
2.1如果不是,请以匿名身份注册
2.1.1使用用户ID创建新集合
2.2如果是,请使用用户ID提取现有集合

通读规范,我发现可以通过以下方式保持用户的Auth State:

firebaseInstance.auth().setPersistence(firebaseAuth.Auth.Persistence.LOCAL)
      .then(function() {
        // Existing and future Auth states are now persisted in the current
        // session only. Closing the window would clear any existing state even
        // if a user forgets to sign out.
        // ...
        // New sign-in will be persisted with session persistence.
        return firebaseInstance.auth().signInAnonymously().catch(function(error) {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          // ...
        })
      })
      .catch(function(error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
      })

然后使用以下命令监听状态更改:

firebaseInstance.auth().onAuthStateChanged(user => {
        if (user) {
          // User is signed in.
          var isAnonymous = user.isAnonymous
          var uid = user.uid

          const test = firebaseInstance.auth().currentUser
          // ...
          debugger
        } else {
          // User is signed out.
          // ...
        }
        // ...
      })

我的理解 我可以想象一下,当Firebase完成初始化时,它会将用户从IndexedDB中拉出,登录完成,并且用户的数据可用。 (如果我错了,请纠正我)

问题 在Firebase完成内部逻辑返回之前,执行firebaseInstance.auth().currentUser会返回null,这让我怀疑Firebase身份验证完成其内部任务时是否可以监听事件->检查当前用户,以及是否即使之后,仍然没有用户->使用新的匿名用户登录。

困惑点 附注:我也感到困惑,为什么一次又一次触发signInAnonymously()仍然返回相同的用户ID。这使我怀疑我是否真的选择了实现功能的“正确”方法。如果有人可以更好地实现功能流程,我将非常感激:)

1 个答案:

答案 0 :(得分:1)

setPersistence(persistence)的Firebase文档指出:

  

Web浏览器应用程序和React Native应用程序的默认值为“ 本地”(前提是浏览器支持此机制),而Node.js后端应用程序的默认值为“无”。

因此,无需显式调用setPersistence(firebaseAuth.Auth.Persistence.LOCAL)

1。等待应用加载

您可以使用原始Javascript,例如:

window.onload = function() {
  // Handle Firebase auth.
}

2。检查用户是否存在,如果不存在,请匿名登录

var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
  var isAnonymous = user.isAnonymous
  var uid = user.uid
} else {
  // No user is signed in.
  firebaseInstance.auth().signInAnonymously().catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;
      // ...
  })
}


// Get user once anonymously signed in.
firebaseInstance.auth().onAuthStateChanged(user => {
  if (user) {
    // User is signed in.
    var isAnonymous = user.isAnonymous
    var uid = user.uid
  } else {
    // User is signed out (does not 'exist')
    firebaseInstance.auth().signInAnonymously().catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;
      // ...
    })
  }
}