🔐

Firebase Auth でログインが永続化できない問題の解決(Javascript SDK)

2023/08/14に公開

情報が少なかったので記事にしました

結論

確認すべきことは以下。

  1. Firebase API Keyが正しいかの確認
  2. onAuthStateChangedを正しく使用できているか
  3. 使用しているAPIKeyで "Token Service API""Identity Toolkit API" を 選択できているか
  4. setPersistenceが記述されていないか確認

Firebase API Keyが正しいかの確認

コンソール > プロジェクトの設定 > 全般 に載っている情報で正しく使用されているか

また、Firebaseで使用してるApiKeyが壊れている場合もあります

うまく動かない場合、GoogleCould のコンソールから正常かどうか確認する必要があります

onAuthStateChangedを正しく使用できているか

余談ですが、永続化できない問題で出てくる解決法が大体これ

公式サイト に詳しく書いているの詳細は省きますが、

const FirebaseAuth = getAuth(FirebaseApp)
const user = FirebaseAuth.currentUser

上記の方法だと必ずすぐにcurrentUserが帰ってくるわけではないのでnullになってしまう場合があります

const FirebaseAuth = getAuth(FirebaseApp)
onAuthStateChanged(), async (user) => {
  // ユーザー保存の処理を書く
})

上記方法を使用してユーザーの変化を監視することが推奨されています

使用しているAPIKeyで "Token Service API""Identity Toolkit API" を 選択できているか

GoogleCould のコンソール で使用しているApiKeyを確認。

API の制限 > キーを制限 している場合 "Token Service API","Identity Toolkit API" が選択できているか確認してください

Identity Toolkit API とは

アカウントの作成・ログイン・ログアウト等ができるAPIです

「そもそもログインができない」 という症状であればこちらが原因の可能性があります。

公式サイトがこちら

https://cloud.google.com/identity-platform/docs/reference/rest

Token Service API とは

JWTを発行することができるAPIです。

FirebaseAuth ではJWTの有効期限1hが終了したら自動で新鮮なJWTを取得するようになっています。
しかしこちらのAPIが有効でなければ発行できません。

「ログインは成功するけど1時間で再ログインしなければならない」 という症状であれば大体こちらが原因だと思われます。

公式サイトがこちら

https://cloud.google.com/iam/docs/reference/sts/rest

setPersistenceが記述されていないか確認

公式サイトから引用。

ウェブ アプリケーションの場合、デフォルトの動作では、ユーザーがブラウザを閉じた後でもユーザーのセッションが維持されます。

デフォルトの設定でログインの永続化はできています。
なので永続化をしたい場合setPersistenceを使用する必要がありません。

永続化ができない場合は上のバグがある可能性が高いです。

まとめ

  1. Firebase API Keyが正しいかの確認
  2. onAuthStateChangedを正しく使用できているか
  3. 使用しているAPIKeyで "Token Service API""Identity Toolkit API" を 選択できているか
  4. setPersistenceが記述されていないか確認

上記を確認すれば大体解決すると思います。

余談ですが私は Token Service API を設定できていなくて10日ほど苦しんだので、誰かの助けになれば幸いです。

また、これで解決しないかった場合、相談を受け付けていますので何なりとご相談ください。

Discussion