Сохранение состояния аутентификации

Вы можете указать, как сохраняется состояние аутентификации при использовании Firebase JS SDK. Сюда входит возможность указать, должен ли вошедший в систему пользователь сохраняться на неопределенный срок до явного выхода из системы, очищаться при закрытии окна или очищаться при перезагрузке страницы.

Для веб-приложения поведением по умолчанию является сохранение сеанса пользователя даже после того, как пользователь закрывает браузер. Это удобно, поскольку пользователю не требуется постоянно входить в систему каждый раз, когда веб-страница посещается на одном и том же устройстве. Это может потребовать от пользователя повторного ввода пароля, отправки SMS-подтверждения и т. д., что может усложнить работу пользователя.

Однако есть случаи, когда такое поведение может быть не идеальным:

  • Приложениям с конфиденциальными данными может потребоваться очистить состояние, когда окно или вкладка закрыты. Это важно на случай, если пользователь забудет выйти из системы.
  • Приложения, используемые на устройстве, которым пользуются несколько пользователей. Типичным примером здесь является приложение, работающее на библиотечном компьютере.
  • Приложение на общем устройстве, к которому могут иметь доступ несколько пользователей. Разработчик не может сказать, как осуществляется доступ к этому приложению, и может захотеть предоставить пользователю возможность выбирать, сохранять ли его сеанс или нет. Это можно сделать, добавив опцию «Запомнить меня» во время входа в систему.
  • В некоторых ситуациях разработчик может захотеть не сохранять анонимного пользователя до тех пор, пока этот пользователь не будет обновлен до неанонимной учетной записи (федеративной, с паролем, телефоном и т. д.).
  • Разработчик может захотеть разрешить разным пользователям входить в приложение на разных вкладках. Поведение по умолчанию — сохранение состояния на всех вкладках одного и того же источника.

Как указано выше, существует множество ситуаций, когда может потребоваться переопределить постоянное постоянство по умолчанию.

Поддерживаемые типы сохранения состояния аутентификации

Вы можете выбрать один из трех типов сохранения состояния аутентификации на указанном экземпляре Firebase Auth в зависимости от вашего приложения или требований пользователя.

Перечисление Ценить Описание
firebase.auth.Auth.Persistence.LOCAL 'местный' Указывает, что состояние будет сохраняться даже при закрытии окна браузера или уничтожении активности в React Native. Чтобы очистить это состояние, необходим явный выход. Обратите внимание, что веб-сеансы Firebase Auth имеют один хост и будут сохраняться только для одного домена.
firebase.auth.Auth.Persistence.SESSION 'сессия' Указывает, что состояние будет сохраняться только в текущем сеансе или вкладке и будет очищено при закрытии вкладки или окна, в котором прошел аутентификацию пользователь. Применяется только к веб-приложениям.
firebase.auth.Auth.Persistence.NONE 'никто' Указывает, что состояние будет храниться только в памяти и будет очищено при обновлении окна или действия.

Изменение постоянства состояния аутентификации

Вы можете указать или изменить существующий тип персистентности, вызвав метод firebase.auth().setPersistence :

Web

import { getAuth, setPersistence, signInWithEmailAndPassword, browserSessionPersistence } from "firebase/auth";

const auth = getAuth();
setPersistence(auth, browserSessionPersistence)
  .then(() => {
    // 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 signInWithEmailAndPassword(auth, email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
  });

Web

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
  .then(() => {
    // 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 firebase.auth().signInWithEmailAndPassword(email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
  });

Это изменит тип сохранения в указанном экземпляре аутентификации для текущего сохраненного сеанса аутентификации и применит этот тип сохранения для будущих запросов на вход, включая вход с запросами на перенаправление. Это вернет обещание, которое будет выполнено, как только состояние завершит копирование из одного типа хранилища в другое. Вызов метода входа после изменения персистентности будет ожидать завершения этого изменения персистентности, прежде чем применять его к новому состоянию аутентификации.

По умолчанию для веб-браузера и приложений React Native используется local (при условии, что браузер поддерживает этот механизм хранения, например, включены сторонние файлы cookie/данные), тогда как для серверных приложений Node.js оно none .

Обзор поведения сохраняемости

Следующие критерии будут применяться при определении текущего состояния устойчивости.

  • Первоначально SDK проверит, существует ли аутентифицированный пользователь. Если не вызывается setPersistence , текущий тип персистентности этого пользователя будет применяться для будущих попыток входа. Таким образом, если этот пользователь сохранялся в session на предыдущей веб-странице и была посещена новая страница, повторный вход в систему с другим пользователем приведет к тому, что состояние этого пользователя также будет сохранено с сохранением session .
  • Если ни один пользователь не вошел в систему и не указано сохранение, будет применена настройка по умолчанию ( local в приложении браузера).
  • Если ни один пользователь не вошел в систему и установлен новый тип сохранения, любая будущая попытка входа будет использовать этот тип сохранения.
  • Если пользователь вошел в систему и тип сохранения изменен, существующий пользователь, вошедший в систему, изменит сохранение на новое. Все будущие попытки входа будут использовать это новое сохранение.
  • При вызове SignInWithRedirect текущий тип персистентности сохраняется и применяется в конце потока OAuth к вновь вошедшему пользователю, даже если персистентность была none . Если постоянство явно указано на этой странице, оно переопределит сохраненное постоянство состояния аутентификации с предыдущей страницы, которая запустила поток перенаправления.

    Web

    import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence, GoogleAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    setPersistence(auth, inMemoryPersistence)
      .then(() => {
        const provider = new GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return signInWithRedirect(auth, provider);
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
      });

    Web

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE)
      .then(() => {
        var provider = new firebase.auth.GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return firebase.auth().signInWithRedirect(provider);
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
      });

Ожидаемое поведение на вкладках браузера

Следующее ожидаемое поведение будет применяться, когда на разных вкладках используются разные типы сохранения. Требование состоит в том, что в любой момент никогда не должно быть одновременно нескольких типов сохраненных состояний (например, состояние аутентификации, сохраненное в session и local типы хранилища):

  • Пользователи могут входить в систему с использованием session или none сохранения с разными пользователями на нескольких вкладках. Каждая вкладка не может видеть состояние другой вкладки.
  • Любая попытка войти в систему с использованием local сохранения будет обнаружена и синхронизирована на всех вкладках. Если пользователь ранее входил в систему на определенной вкладке с использованием session или none сохранения, это состояние будет очищено.
  • Если пользователь ранее вошел в систему с использованием local сохранения с несколькими открытыми вкладками, а затем переключился на none или «Сохранение session на одной вкладке, состояние этой вкладки будет изменено, при этом пользователь будет сохраняться в session или none , а на всех других вкладках пользователь будет отключен.