我正在尝试实现以下流程:
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。这使我怀疑我是否真的选择了实现功能的“正确”方法。如果有人可以更好地实现功能流程,我将非常感激:)
答案 0 :(得分:1)
setPersistence(persistence)
的Firebase文档指出:
Web浏览器应用程序和React Native应用程序的默认值为“ 本地”(前提是浏览器支持此机制),而Node.js后端应用程序的默认值为“无”。
因此,无需显式调用setPersistence(firebaseAuth.Auth.Persistence.LOCAL)
。
您可以使用原始Javascript,例如:
window.onload = function() {
// Handle Firebase auth.
}
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;
// ...
})
}
}