この記事では、Firebase Authenticationを用いたアプリ開発において、
ログインしているにも関わらずgetCurrentUser
メソッドがnull
を返す場合の原因と解決法を解説します。
公式ドキュメントの該当ページ: https://firebase.google.com/docs/auth/web/manage-users?hl=ja
【目次】
- 状況
- 原因:なぜgetCurrentUserがnullを返すのか
- nullを返す2つのパターン
- 解決策
- Firebaseの初期化(initializeApp)
- onAuthStateChangedを実行してAuthを初期化する
- まとめ
状況
Firebase Authenticationでは、getCurrentUser
メソッドを利用して、現在ログインしているユーザーの情報を取得することができます。
しかし、ログインしているのにも関わらず、このメソッドがnull
を返すことがあります。
原因:なぜgetCurrentUser
がnull
を返すのか
この問題の原因は、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
nullを返す2つのパターン
つまり、getCurrentUser
がnull
を返す場合、2つの異なるパターンがあります。
- ユーザーが実際にログインしていない状態。
- ユーザーはログインしているが、Authオブジェクトの初期化が完了していないために
null
が返される状態。
もちろん、1の「実際にログインしていない状態」ならばnullで合っているので問題ありません。
解決策
この問題に対処する最も直接的な方法は、onAuthStateChanged
を使用してログイン状態の変化を監視することです。
Firebase Authenticationでのログイン状態の監視とgetCurrentUser
がnull
を返す問題の解決には、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のgetCurrentUser
がnull
を返す問題に対処し、ユーザーのログイン状態の変更を効果的に監視できるようになります。
さらに付け加えると、毎回初期化するのはイケていないので、getCurrentUserの結果がnullの場合にだけonAuthStateChangedを実行するのが良いでしょう。
ユーザーがログインしているかどうかを確認し、ログインしている場合はその情報を利用する、あるいはログインしていない場合にはログインページにリダイレクトするなど、適切な処理を記述できます。
まとめ
Firebase Authenticationを使用する際にgetCurrentUser
がnull
を返す問題は、Authオブジェクトの初期化が完全に終了していないことによって起こります。
この問題を解決するためには、onAuthStateChanged
を使用してユーザーのログイン状態の変化を監視する必要があります。
その後、getCurrentUser
によってユーザー情報を取得できます。
なお、onAuthStateChanged
自体もユーザー情報を渡してくれるので、そこで保管する方法でも良いです。