Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

認証状態の永続性

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

FirebaseJSSDKを使用するときに認証状態を維持する方法を指定できます。これには、サインインしたユーザーを明示的にサインアウトするまで無期限に保持するか、ウィンドウを閉じるときにクリアするか、ページのリロード時にクリアするかを指定する機能が含まれます。

Webアプリケーションの場合、デフォルトの動作は、ユーザーがブラウザーを閉じた後もユーザーのセッションを保持することです。これは、ユーザーが同じデバイスでWebページにアクセスするたびに継続的にサインインする必要がないため便利です。これには、ユーザーがパスワードを再入力したり、SMS検証を送信したりする必要があり、ユーザーエクスペリエンスに大きな摩擦が加わる可能性があります。

ただし、この動作が理想的でない場合があります。

  • 機密データを使用するアプリケーションでは、ウィンドウまたはタブを閉じたときに状態をクリアしたい場合があります。これは、ユーザーがサインアウトするのを忘れた場合に重要です。
  • 複数のユーザーが共有するデバイスで使用されるアプリケーション。ここでの一般的な例は、図書館のコンピューターで実行されているアプリです。
  • 複数のユーザーがアクセスする可能性のある共有デバイス上のアプリケーション。開発者は、そのアプリケーションがどのようにアクセスされているかを知ることができず、セッションを永続化するかどうかを選択する機能をユーザーに提供したい場合があります。これは、サインイン時に「Rememberme」オプションを追加することで実行できます。
  • 状況によっては、開発者は、匿名ユーザーが非匿名アカウント(フェデレーション、パスワード、電話など)にアップグレードされるまで、そのユーザーを永続化したくない場合があります。
  • 開発者は、さまざまなユーザーがさまざまなタブでアプリケーションにサインインできるようにすることができます。デフォルトの動作では、同じオリジンのタブ間で状態を保持します。

上記のように、デフォルトの永続的な永続性をオーバーライドする必要がある状況は複数あります。

サポートされているタイプの認証状態の永続性

アプリケーションまたはユーザーの要件に基づいて、指定したFirebaseAuthインスタンスで3種類の認証状態の永続性のいずれかを選択できます。

列挙型価値説明
firebase.auth.Auth.Persistence.LOCAL 'ローカル'ブラウザウィンドウを閉じたり、React Nativeでアクティビティが破棄されたりしても、状態が維持されることを示します。その状態をクリアするには、明示的なサインアウトが必要です。 Firebase Auth Webセッションは単一のホストオリジンであり、単一のドメインに対してのみ保持されることに注意してください。
firebase.auth.Auth.Persistence.SESSION 'セッション'状態が現在のセッションまたはタブでのみ持続し、ユーザーが認証されたタブまたはウィンドウが閉じられるとクリアされることを示します。 Webアプリにのみ適用されます。
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インスタンスの永続性のタイプが変更され、リダイレクト要求を使用したサインインを含む、将来のサインイン要求にこのタイプの永続性が適用されます。これにより、あるタイプのストレージから別のタイプのストレージへの状態のコピーが完了すると解決されるPromiseが返されます。永続性を変更した後にサインインメソッドを呼び出すと、永続性の変更が完了するのを待ってから、新しい認証状態に適用します。

WebブラウザーとReactNativeアプリのデフォルトはlocalです(ブラウザーがこのストレージメカニズムをサポートしている場合、たとえばサードパーティのCookie /データが有効になっている場合)が、Node.jsバックエンドアプリではデフォルトではありnone

永続性の動作の概要

永続性の現在の状態を判断するときに、次の基準が適用されます。

  • 最初に、SDKは認証されたユーザーが存在するかどうかを確認します。 setPersistenceが呼び出されない限り、そのユーザーの現在の永続性タイプは、今後のサインインの試行に適用されます。そのため、そのユーザーが前のWebページのsessionで永続化され、新しいページにアクセスした場合、別のユーザーで再度サインインすると、そのユーザーの状態もsessionの永続化とともに保存されます。
  • サインインしていないユーザーと永続性が指定されていない場合は、デフォルト設定が適用されます(ブラウザーアプリではlocal )。
  • サインインしているユーザーがなく、新しいタイプの永続性が設定されている場合、今後のサインインの試行では、そのタイプの永続性が使用されます。
  • ユーザーがサインインして永続性タイプが変更された場合、その既存のサインインユーザーは永続性を新しいものに変更します。今後のすべてのサインイン試行では、その新しい永続性が使用されます。
  • signInWithRedirectが呼び出されると、永続性がnoneであった場合でも、現在の永続性タイプが保持され、OAuthフローの最後に新しくサインインしたユーザーに適用されます。そのページで永続性が明示的に指定されている場合、リダイレクトフローを開始した前のページから保持されている認証状態の永続性が上書きされます。

    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永続性を使用してサインインし、1つのタブでnoneまたはsession永続性に切り替えた場合、そのタブの状態は、ユーザーがsessionまたはnoneで永続化され、他のすべてのタブでユーザーが変更されます。サインアウトされます。