Firebase-SPA Web应用程序-注销问题

时间:2018-11-18 14:05:32

标签: javascript firebase firebase-authentication google-signin firebaseui

我最近制作了一个简单的SPA应用程序,该应用程序使用Google提供程序连接到Firebase并为经过身份验证的用户加载数据。 一切都很棒,直到我尝试使用文档中的以下方法注销用户:

firebase.auth().signOut()

注销成功,但是在此之后,由于收到以下错误,我无法再次登录:

  

updateCurrentUser失败:第一个参数“ user”必须是Firebase User的实例或为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中注册的观察者。

1 个答案:

答案 0 :(得分:0)

我自己找到了答案。 有几个问题。首先,应将Firebase初始化放置为“全局”,例如:https://github.com/firebase/firebaseui-web/,尤其是以下几行:

firebase.initializeApp(config);
ui = new firebaseui.auth.AuthUI(firebase.auth());

第二,使用输入的代码,我必须使用条件获取ui的现有实例。在firebase github中,始终使用new运算符创建ui,并且每次脚本运行时始终创建一次。 我发现,有一种解决方法-可以使用delete()promise删除ui实例。