AIイノベーションズ

Firebase AuthでログインしているのにgetCurrentUser関数がnullを返してしまう時の解決法

Firebase Authenticationでログイン済みなのにgetCurrentUser()がnullを返す問題を解決!Authオブジェクトの初期化タイミングとonAuthStateChangedの正しい使い方を解説。よくある落とし穴とその回避方法を詳しく説明します。

この記事では、Firebase Authenticationを用いたアプリ開発において、 ログインしているにも関わらずgetCurrentUserメソッドがnullを返す場合の原因と解決法を解説します。

公式ドキュメントの該当ページ: https://firebase.google.com/docs/auth/web/manage-users?hl=ja

状況

Firebase Authenticationでは、getCurrentUserメソッドを利用して、現在ログインしているユーザーの情報を取得することができます。

しかし、ログインしているのにも関わらず、このメソッドがnullを返すことがあります。

原因:なぜgetCurrentUsernullを返すのか

この問題の原因は、Firebase AuthenticationのAuthオブジェクトが完全に初期化されていない状態にあります。

Authが初期化されずにgetCurrentUserを呼び出してしまうとnullが返されるのです。

Firebaseの公式ドキュメントにはこの点が指摘されていますが、その注意書きは小さく記述されているだけなので、気づきづらいのです。。。

> 注: currentUser が null になる原因としては、Auth オブジェクトの初期化が完了していないことも考えられます。オブザーバーを使用してユーザーのログイン ステータスを追跡している場合は、この状況に対処する必要はありません。
[https://firebase.google.com/docs/auth/web/manage-users?hl=ja#get_the_currently_signed-in_user](https://firebase.google.com/docs/auth/web/manage-users?hl=ja#get_the_currently_signed-in_user)
>

nullを返す2つのパターン

つまり、getCurrentUsernullを返す場合、2つの異なるパターンがあります。

  1. ユーザーが実際にログインしていない状態。
  2. ユーザーはログインしているが、Authオブジェクトの初期化が完了していないためにnullが返される状態。

もちろん、1の「実際にログインしていない状態」ならばnullで合っているので問題ありません。

解決策

この問題に対処する最も直接的な方法は、onAuthStateChangedを使用してログイン状態の変化を監視することです。

Firebase Authenticationでのログイン状態の監視とgetCurrentUsernullを返す問題の解決には、Firebaseの認証状態の変更をリッスンするonAuthStateChangedメソッドを利用します。JavaScriptでの実装例は以下のようになります。

Firebaseの初期化(initializeApp)

まず、Firebaseプロジェクトの初期化が必要です。このステップは、Firebaseプロジェクトを作成し、WebアプリにFirebaseを追加した後に提供される設定情報を使用して行います。

// Firebaseプロジェクトの設定。実際のプロジェクトに合わせて値を設定してください。
var firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID"
};
 
// Firebaseを初期化
firebase.initializeApp(firebaseConfig);

onAuthStateChangedを実行してAuthを初期化する

次に、onAuthStateChangedリスナーを使用してユーザーのログイン状態を監視します。

このリスナーは、ユーザーのログイン状態が変更されるたびに呼び出されます。ユーザーがログインしている場合はユーザー情報が、ログアウトしている場合はnullが渡されます。

 
// Authオブジェクトを初期化する
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // ユーザーがログインしている状態
    console.log("Logged in user:", user);
    // 必要に応じて、ここでユーザー情報を利用した処理を行う
  } else {
    // ユーザーがログアウトしている状態、またはAuthオブジェクトの初期化が完了していない状態
    console.log("No user is logged in or the Auth object is not initialized yet.");
    // ログインページへのリダイレクトなど、必要に応じて処理を行う
  }
});

これによって、Firebase AuthenticationのgetCurrentUsernullを返す問題に対処し、ユーザーのログイン状態の変更を効果的に監視できるようになります。

さらに付け加えると、毎回初期化するのはイケていないので、getCurrentUserの結果がnullの場合にだけonAuthStateChangedを実行するのが良いでしょう。

ユーザーがログインしているかどうかを確認し、ログインしている場合はその情報を利用する、あるいはログインしていない場合にはログインページにリダイレクトするなど、適切な処理を記述できます。

まとめ

Firebase Authenticationを使用する際にgetCurrentUsernullを返す問題は、Authオブジェクトの初期化が完全に終了していないことによって起こります。

この問題を解決するためには、onAuthStateChangedを使用してユーザーのログイン状態の変化を監視する必要があります。

その後、getCurrentUserによってユーザー情報を取得できます。

なお、onAuthStateChanged自体もユーザー情報を渡してくれるので、そこで保管する方法でも良いです。

On this page