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
を返すことがあります。
原因:なぜgetCurrentUser
がnull
を返すのか
この問題の原因は、Firebase AuthenticationのAuthオブジェクトが完全に初期化されていない状態にあります。
Authが初期化されずにgetCurrentUser
を呼び出してしまうとnullが返されるのです。
Firebaseの公式ドキュメントにはこの点が指摘されていますが、その注意書きは小さく記述されているだけなので、気づきづらいのです。。。
nullを返す2つのパターン
つまり、getCurrentUser
がnull
を返す場合、2つの異なるパターンがあります。
- ユーザーが実際にログインしていない状態。
- ユーザーはログインしているが、Authオブジェクトの初期化が完了していないために
null
が返される状態。
もちろん、1の「実際にログインしていない状態」ならばnullで合っているので問題ありません。
解決策
この問題に対処する最も直接的な方法は、onAuthStateChanged
を使用してログイン状態の変化を監視することです。
Firebase Authenticationでのログイン状態の監視とgetCurrentUser
がnull
を返す問題の解決には、Firebaseの認証状態の変更をリッスンするonAuthStateChanged
メソッドを利用します。JavaScriptでの実装例は以下のようになります。
Firebaseの初期化(initializeApp)
まず、Firebaseプロジェクトの初期化が必要です。このステップは、Firebaseプロジェクトを作成し、WebアプリにFirebaseを追加した後に提供される設定情報を使用して行います。
onAuthStateChangedを実行してAuthを初期化する
次に、onAuthStateChanged
リスナーを使用してユーザーのログイン状態を監視します。
このリスナーは、ユーザーのログイン状態が変更されるたびに呼び出されます。ユーザーがログインしている場合はユーザー情報が、ログアウトしている場合はnull
が渡されます。
これによって、Firebase AuthenticationのgetCurrentUser
がnull
を返す問題に対処し、ユーザーのログイン状態の変更を効果的に監視できるようになります。
さらに付け加えると、毎回初期化するのはイケていないので、getCurrentUserの結果がnullの場合にだけonAuthStateChangedを実行するのが良いでしょう。
ユーザーがログインしているかどうかを確認し、ログインしている場合はその情報を利用する、あるいはログインしていない場合にはログインページにリダイレクトするなど、適切な処理を記述できます。
まとめ
Firebase Authenticationを使用する際にgetCurrentUser
がnull
を返す問題は、Authオブジェクトの初期化が完全に終了していないことによって起こります。
この問題を解決するためには、onAuthStateChanged
を使用してユーザーのログイン状態の変化を監視する必要があります。
その後、getCurrentUser
によってユーザー情報を取得できます。
なお、onAuthStateChanged
自体もユーザー情報を渡してくれるので、そこで保管する方法でも良いです。