Постоянство состояния аутентификации

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Вы можете указать, как сохраняется состояние аутентификации при использовании 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 version 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;
  });

Web version 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 (при условии, что браузер поддерживает этот механизм хранения, например, включены сторонние файлы cookie/данные), тогда как для серверных приложений Node.js это значение none .

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

При определении текущего состояния сохраняемости будут применяться следующие критерии.

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

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

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