Firebase - веб-приложение SPA - проблема с выходом из системы - PullRequest
0 голосов
/ 18 ноября 2018

Недавно я создал простое приложение SPA, которое подключается к базе данных Firebase с помощью провайдера Google и загружает данные для аутентифицированного пользователя. Все было замечательно, пока я не попытался выйти из системы, используя следующий метод из документации:

firebase.auth().signOut()

Выход был успешным, но после этого я не могу войти снова, потому что я получаю следующую ошибку:

updateCurrentUser не удалось: первый аргумент «пользователь» должен быть экземпляром пользователя Firebase или нулевым.

Когда я проверял вкладку сети в своем браузере, я видел мои пользовательские данные в ответах, поэтому возникла проблема с 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 голосов
/ 19 ноября 2018

Я нашел ответ сам.Было несколько проблем.Во-первых, инициализация Firebase должна быть помечена как «глобальная», как, например, здесь: https://github.com/firebase/firebaseui-web/, особенно это строки:

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

Во-вторых, с моим кодом из ввода, я должен получитьсуществующий экземпляр пользовательского интерфейса с использованием условного.В FireBase GitHub пользовательский интерфейс создавался всегда с использованием оператора new, и он всегда создавался один раз за запуск сценария.Я обнаружил, что существует обходной путь - экземпляр пользовательского интерфейса можно удалить с помощью обещания delete ().

...