🏬

[Identity Platform] マルチテナント環境におけるセッション管理方法

2024/04/05に公開

要約

  1. セッション管理は(Go の)Admin SDK における 「トークン検証メソッド」と「トークン無効化メソッド」で実現可能
  2. セッション Cookie を用いる方法は、マルチテナント環境ではサポートされていない
  3. カスタムトークンを用いる方法は、Go の Admin SDK では有効期限をカスタマイズできない

1. はじめに

みなさんこんにちは。クラウドエース バックエンドエンジニアリング部所属の唐津です。
Identity Platform におけるセッション管理方法を調査しましたので、その内容を共有いたします。

1.1. Identity Platform とは

Identity Platform は、Firebase Authentication の上位版として提供されている Google Cloud の IDaaS です。
Google、Facebook などの ID プロバイダーと手軽に連携できるほか、Firebase Authentication では提供されていなかった多要素認証機能マルチテナンシー機能が利用できます。
それぞれの機能の比較はこちらをご参照ください。

1.2. マルチテナントとは

先ほど触れたマルチテナンシー機能は、プロジェクト配下に作成できる複数のテナント(ユーザーグループ)を管理する機能です。
マルチテナンシー機能を用いると、テナントごとに有効にする ID プロバイダーやパスワードポリシーを設定できます。

1.3. ID トークンの有効期限とその問題点

認証に成功すると ID トークン (= アクセストークン) が発行され、以後のリクエストにその JWT を添付することで認証の代わりに利用できます。
ID トークンの有効期限は 1 時間固定であり、1 時間を超えた場合は更新トークン(= リフレッシュトークン)を用い、ID トークンを再発行します。
しかし、1 時間未満でセッション管理を行いたい場合、ID トークン、更新トークン以外のセッション管理方法を用意する必要があります。

2. セッション管理方法

2.1. (Go の)Admin SDK における 「トークン検証メソッド」と「トークン無効化メソッド」を用いる方法

2.1.1. メソッドの説明

  1. トークン検証メソッド

    • メソッド名はVerifyIDTokenAndCheckRevoked
    • テナント配下のユーザーに対しては TenantClient がレシーバーであるメソッドを用いる
    • 有効な ID トークンか判定するだけでなく、トークンやユーザーが無効化されていないかも確認する
  2. トークン無効化メソッド

    • メソッド名はRevokeRefreshTokens
    • 同様にテナント配下のユーザーに対しては TenantClient がレシーバーであるメソッドを用いる
    • ユーザー情報を変更し、発行済みのトークンを無効化する(正確には、VerifyIDTokenAndCheckRevoked メソッド呼び出し時に無効だと判断されるようになる)
「VerifyIDTokenAndCheckRevoked メソッド呼び出し時に無効だと判断されるようになる」とは
Go の Admin SDK のバージョンについて注意

2.1.2. シーケンス図

「トークン検証メソッド」と「トークン無効化メソッド」を用いたセッション管理をイメージしやすくするため、以下にシーケンス図を示します。
この図では、セッション時間を 20 分としています。

session_management

他にも、Firebase Authentication の頃から提供されているセッション管理方法として、セッション Cookie を用いる方法があります。
しかし、残念ながら 2024 年 4 月現在、公式ドキュメントによると、マルチテナント環境ではセッション Cookie 管理する機能はサポートされていません。
テナントを用いない場合のセッション Cookie の管理方法については、Firebase Authentication で学ぶ ソーシャルログイン入門 ID 管理の原則にそった実装のベストプラクティスという本で詳しく説明されているのでご参照ください。

2.3 カスタムトークンを用いる方法

最後に、セッション管理方法として自分で発行するカスタムトークンを用いる方法が考えられます。
しかし 2024 年 4 月現在、Go の Admin SDK ではカスタムトークンの有効期限が 1 時間固定になっているため、セッション時間を 20 分にする、ということができません。
(PHP や Ruby のサードパーティの JWT ライブラリでは有効期限をカスタマイズできると公式ドキュメントに書かれているため、サードパーティのライブラリを利用することで実現可能かもしれません)

3. まとめ

本記事では、Identity Platform におけるセッション管理方法についてご紹介しました。
Identity Platform を用いたシステムを構築する際に、参考にしていただければ幸いです。

Discussion