Firebase - SPA Web 应用程序 - 注销问题
Firebase - SPA web application - issue with logout
我最近制作了一个简单的 SPA 应用程序,它使用 Google 提供程序连接到 firebase 并为经过身份验证的用户加载数据。
一切都很好,直到我尝试使用文档中的以下方法注销用户:
firebase.auth().signOut()
注销成功,但之后,我无法再次登录,因为我收到以下错误:
updateCurrentUser failed: First argument "user" must be an instance of Firebase User or null.
当我在浏览器中检查网络选项卡时,我在响应中看到了我的用户数据,因此 firebasewebui 可能存在问题。
我也试过的东西
- 在另一个浏览器中登录 - 正常
- 以隐身模式登录 - 不工作
- 从其他域登录(例如在 firebase 控制台中授权的假域)- 工作
- 从计算机上擦除我的整个 Google Chrome 配置文件并重新添加 - 无法正常工作
- 从 Android 应用程序登录 - 工作正常(这里没有注销和登录问题)
所以它看起来像是与域和浏览器组合有关的东西。
这是我的js代码:
const firebase = require('firebase/app');
require('firebase/auth');
require('firebaseui');
const initializeFirebase = () => {
const config = { /* config */ };
firebase.initializeApp(config);
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
// loads data
} else {
// visibility staff
initializeFirebaseAuthForm();
}
});
}
const initializeFirebaseAuthForm = () => {
const uiConfig = {
callbacks: {
signInSuccessWithAuthResult: function (authResult, redirectUrl) {
return false;
},
uiShown: function () {
visibilityManager(false);
}
},
signInFlow: 'popup',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID
]
};
let ui = null;
if (firebaseui.auth.AuthUI.getInstance()) {
ui = firebaseui.auth.AuthUI.getInstance();
} else {
ui = new firebaseui.auth.AuthUI(firebase.auth());
}
ui.start('#firebaseui-auth-container', uiConfig);
}
document.addEventListener('DOMContentLoaded', function () {
initializeFirebase();
});
在这种情况下,我在 onAuthStateChanged 中注册的观察者不会被触发。
我自己找到了答案。
有几个问题。首先,Firebase 初始化应放置为 'global',例如此处:https://github.com/firebase/firebaseui-web/,尤其是这一行:
firebase.initializeApp(config);
ui = new firebaseui.auth.AuthUI(firebase.auth());
其次,使用我的输入代码,我必须使用条件获取 ui 的现有实例。在 firebase github 中,ui 始终使用 new 运算符创建,并且始终在每个脚本 运行 中创建一次。
我发现有解决方法 - ui 可以使用 delete() promise 删除实例。
我最近制作了一个简单的 SPA 应用程序,它使用 Google 提供程序连接到 firebase 并为经过身份验证的用户加载数据。 一切都很好,直到我尝试使用文档中的以下方法注销用户:
firebase.auth().signOut()
注销成功,但之后,我无法再次登录,因为我收到以下错误:
updateCurrentUser failed: First argument "user" must be an instance of Firebase User or null.
当我在浏览器中检查网络选项卡时,我在响应中看到了我的用户数据,因此 firebasewebui 可能存在问题。
我也试过的东西
- 在另一个浏览器中登录 - 正常
- 以隐身模式登录 - 不工作
- 从其他域登录(例如在 firebase 控制台中授权的假域)- 工作
- 从计算机上擦除我的整个 Google Chrome 配置文件并重新添加 - 无法正常工作
- 从 Android 应用程序登录 - 工作正常(这里没有注销和登录问题)
所以它看起来像是与域和浏览器组合有关的东西。
这是我的js代码:
const firebase = require('firebase/app');
require('firebase/auth');
require('firebaseui');
const initializeFirebase = () => {
const config = { /* config */ };
firebase.initializeApp(config);
firebase.auth().onAuthStateChanged(function (user) {
if (user) {
// loads data
} else {
// visibility staff
initializeFirebaseAuthForm();
}
});
}
const initializeFirebaseAuthForm = () => {
const uiConfig = {
callbacks: {
signInSuccessWithAuthResult: function (authResult, redirectUrl) {
return false;
},
uiShown: function () {
visibilityManager(false);
}
},
signInFlow: 'popup',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID
]
};
let ui = null;
if (firebaseui.auth.AuthUI.getInstance()) {
ui = firebaseui.auth.AuthUI.getInstance();
} else {
ui = new firebaseui.auth.AuthUI(firebase.auth());
}
ui.start('#firebaseui-auth-container', uiConfig);
}
document.addEventListener('DOMContentLoaded', function () {
initializeFirebase();
});
在这种情况下,我在 onAuthStateChanged 中注册的观察者不会被触发。
我自己找到了答案。 有几个问题。首先,Firebase 初始化应放置为 'global',例如此处:https://github.com/firebase/firebaseui-web/,尤其是这一行:
firebase.initializeApp(config);
ui = new firebaseui.auth.AuthUI(firebase.auth());
其次,使用我的输入代码,我必须使用条件获取 ui 的现有实例。在 firebase github 中,ui 始终使用 new 运算符创建,并且始终在每个脚本 运行 中创建一次。 我发现有解决方法 - ui 可以使用 delete() promise 删除实例。