Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

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

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

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

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

Изменение сохраняемости состояния аутентификации

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

Веб-версия 9

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;
  });

Веб-версия 8

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;
  });

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

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

Обзор персистентного поведения

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

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

    Веб-версия 9

    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;
      });

    Веб-версия 8

    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 и на все другие вкладки, пользователь будет выполнен выход.