Firebase IDトークンについて

0

2022年04月23日 6:16

こんにちは、ISSUEの寒河江です。

最近は開発にFirebaseを利用することが多いです。認証まわりはGoogleの基盤を使うことでよしなにやってくれているので正直あまり気にしていませんでした。しかしサービスの規模大きくなるにつれセキュリティ面への理解が必要になり、その足掛かりとして今回IDトークン周りについて改めて調べてみました。

トークンの種類

今回着目しているIDトークンに関しては2種類のトークンが存在します。わかりづらいので用途を最初に書いておきました!

IDトークン→実際に認証に使われるトークン、ユーザー情報を含んでいる
更新トークン→実際の認証には使われない、IDトークンをリフレッシュするためのトークン

Firebase IDトークンとは

Firebase Authの認証方法に使われるJWTです。他にもID プロバイダ トークンやFirebase カスタムトークンなどがあります。有効期限は1時間で、期限切れになると更新トークンにより新しいIDトークンと交換されます。基本的な使い方としてはAPIのリクエスト認証が多いと思います。HTTPSリクエストを送る際に、リクエストヘッダーのAuthorizationにセットします。
img

ユーザーに紐づけられたIDトークンを取得するにはgetIdToken関数を使います。
img
tokenリフレッシュは更新トークンを利用して、新たなIDトークンを取得します。

なぜIDトークンのリフレッシュが必要か

そもそも期限も短いのになぜリフレッシュする必要があるのかという疑問もあります。それはFirebase Authで提供されている別の機能で必要になる場合があります。例えばカスタム クレームでは、クレームを更新したとしてもIDトークンをリフレッシュしないと反映されません。カスタムクレーム利用方法と注意点はこちら。

バックエンドでIDトークンの検証を行う

IDトークンをリクエスト共にバックエンドに送ったら、トークンの検証を行います。この処理はミドルウェアで行うイメージです。IDトークンの検証が通ればそのリクエストに沿った処理をします。
img

更新トークンとは

認証時にIDトークンと一緒にFirebaseのバックエンドから取得されるトークンで、IDトークンが切れた際に新しいIDトークンの取得を行います。更新トークンは期限切れになることは基本的にありませんが、下記いずれかのケースで失効します。ユーザーデバイスの盗難や紛失、脆弱性を発見した場合などは更新トークンを失効させる必要があります。

  • ユーザーが削除される
  • ユーザーが無効にされる
  • ユーザーのアカウントで大きな変更が検出される(パスワードやメールアドレスの更新など)
  • Firebase Admin SDKで更新トークンを失効させる

Firebase Admin SDKで更新トークンを失効させる

バックエンド側で更新トークンを失効させることもできます。更新トークンの失効にRevokeRefreshTokensを使います。

img

更新トークンが失効してもIDトークンは生きている可能性がある

注意点としては例え更新トークンを失効させていたとしても、IDトークンの有効期限(1時間)内なら認証に通ってしまうことです。これを防ぐにはIDトークンの検証時、更新トークンが失効しているかどうかも確認する必要があります。SDKではIDトークンと更新トークンを同時に検証するメソッドVerifyIDTokenAndCheckRevokedが用意されています。失効していた場合、クライアントでは再認証を求める処理を実行します。

img

更新トークンを実装する機会はあまり多くないと思いますが、IDトークンの全容を理解するためにも人通りお伝えしました。以上最後まで読んでいただきありがとうございました。

参考

ID トークンを検証する
Firebase Authenticationのトークン解説
ユーザー セッションの管理

# Firebase
# Firestore
# Go
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。

目次を見る