🤖
【初心者向け】Firebaseの認証システム・匿名認証・トークンの関係を分かりやすく解説
こんにちは、ワニかず@40歳 出戻りエンジニアです。
今回は、Firebaseの認証システム、特に匿名認証(signInAnonymously)と
トークンの関係についてまとめました。
まずは図解
身近な生活に例えると?
UIDを永久パスと例えると、トークンは「有効期限付きの一時入場券」のような概念になります。
以下のような例えで考えてみましょう。
-
UID(永久パス):
- テーマパークの年間パスポートや会員カードのようなもの
- あなたの身分証明であり、システム内での一意の識別子
- 会員登録されている限り有効で、削除されない限り変更されない
- データベース内であなたのデータを特定するための「住所」のような役割
-
トークン(一時入場券):
- その永久パスを持っていることを証明する「当日の入場券」
- セキュリティ上の理由から、約1時間で期限が切れる
- 入場券には「この人は確かに永久パスを持っている会員である」という証明と、入場許可の情報が記載されている
- セキュリティ機能として、偽造防止のデジタル署名が含まれている
-
リフレッシュトークン:
- 「入場券交換券」のようなもの
- 入場券(IDトークン)が期限切れになる前に、新しい入場券と交換できる
- これにより、会員は毎回受付に行って身分確認をしなくても、新しい入場券を自動的に取得できる
ユーザー削除の状況を例えで説明すると:
会員資格が取り消されても(UIDが削除されても)、すでに発行された当日の入場券(トークン)は期限まで有効なので、パーク内(Firestore)のアトラクション(データ)に一時的にアクセスできる状態が続きます。しかし、入場券の期限が切れると、もう新しい入場券を取得することはできず、アクセスも不可能になります。
このように、UIDは長期的な身分証明であり、トークンはその身分を一時的に証明する手段という関係になっています。
Firebase認証の主要コンポーネント
1. UID(User ID)
- 各ユーザーに割り当てられる一意の識別子
-
signInAnonymously()
を実行すると、Firebaseは匿名ユーザーを作成してUIDを発行 - UIDはユーザーオブジェクト(
firebase.auth().currentUser.uid
)で取得可能 - データベース内のユーザーデータへの参照に使用される
2. IDトークン(JWT)
- JSON Web Token形式で発行される認証トークン
- ユーザーがログインすると自動的に生成・管理される
- 通常の有効期限は約1時間
- トークンには以下の情報が含まれる:
-
sub
: ユーザーのUID -
aud
: Firebase ProjectのID -
exp
: 有効期限のタイムスタンプ -
iat
: 発行時のタイムスタンプ - ユーザーに関する追加情報(email, nameなど)
-
3. リフレッシュトークン
- IDトークンを更新するための長期的に有効なトークン
- IDトークンが期限切れになる前に、自動的に新しいIDトークンを取得するために使用
- ユーザーが明示的にサインアウトするか、Firebaseコンソールから無効化されるまで有効
認証フロー(図解の補足説明)
-
認証初期化:
-
signInAnonymously()
実行時、Firebaseはバックエンドで匿名ユーザーアカウントを作成 - クライアントはUserオブジェクト(UIDを含む)とIDトークンを受け取る
-
-
データアクセス:
- クライアントがFirestoreにリクエストを送る際、IDトークンが自動的に添付される
- Firestoreはトークンを検証し、
request.auth
オブジェクトとしてセキュリティルールで使用できるようにする -
request.auth.uid
でユーザーIDにアクセス可能
-
トークン管理:
- IDトークンは約1時間で期限切れになる
- Firebase SDKはバックグラウンドで自動的にトークンを更新
- ブラウザセッションが維持されている限り、ユーザーは再認証なしでサービスにアクセス可能
-
ユーザー削除時の挙動:
- Firebaseコンソールからユーザーを削除しても、クライアント側のトークンはすぐには無効化されない
- 有効期限(約1時間)が切れるまでトークンは使用可能
- 時間経過後、またはアプリ再起動時に認証エラーが発生
Discussion