🐷

Firebase Authentication Custom Claimsを駆使した認証フローの構築

2023/10/31に公開

こんにちは!普段は Firebase や Next.js、TypeScript などの技術を駆使して開発をしているエンジニアのおおさきです。今日は、Firebase Authentication の Custom Claims を使った認証フローについて、ハンズオン形式で解説していきます。


①custom claims とは?

Firebase Authentication の Custom Claims とは、ユーザーの ID トークンに追加できるカスタム属性のことを指します。これにより、ユーザーに特定の役割や権限を付与することができます。例えば、admineditorのようなロールをユーザーに割り当てることが可能です。


②custom claims のユースケース

Custom Claims の主なユースケースは、以下のようなものが考えられます。

  1. ロールベースのアクセス制御: ユーザーにadmineditorのようなロールを割り当て、特定のリソースへのアクセスを制御する。
  2. 特定の機能の制限: 例えば、プレミアムユーザーのみが利用できる機能を提供する際に、Custom Claims を使ってユーザーのステータスを識別する。
  3. セキュリティルールの強化: Firebase のセキュリティルールで Custom Claims を参照し、データベースやストレージへのアクセスを制御する。

③custom claims を使うメリット・デメリット

メリット:

  1. 柔軟性: ユーザーごとに異なる属性やロールを付与することができる。
  2. セキュリティ: Firebase のセキュリティルールと組み合わせることで、データのアクセス制御を強化できる。
  3. 効率的な認証フロー: Custom Token を使用して、初回ログイン時から特定のロールや属性を持った状態でログインさせることができる。

デメリット:

  1. サイズ制限: Custom Claims のサイズは、全体で最大 1KB という制限がある。
  2. 更新の遅延: Custom Claims の変更は、次回のユーザーのトークンリフレッシュ時にのみ反映されるため、即時の反映は期待できない。

次のセクションでは、Custom Claims の実際の設定方法や、Cloud Functions を使った実装例について解説していきます。特に、signup 用の API を用意し、Firebase Admin SDK を使用して Custom Claims を設定する方法や、セキュリティルールでの利用方法など、実践的な内容を中心にお伝えしていきます。


④custom claims の実際の書き方・実行方法

さて、Custom Claims の基本的な概念やメリット・デメリットを理解したところで、具体的な実装に移りましょう。

1. Cloud Functions の設定

まず、Cloud Functions で signup 用の API を用意します。この API では、Firebase Admin SDK を使用して、ユーザーに Custom Claims を設定します。

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

admin.initializeApp();

exports.setCustomClaims = functions.https.onCall(async (data, context) => {
  const { uid, role } = data;

  // Custom Claimsを設定
  await admin.auth().setCustomUserClaims(uid, { role });

  // Custom Tokenを生成
  const customToken = await admin.auth().createCustomToken(uid, { role });

  return { customToken };
});

上記のコードでは、ユーザーの UID と役割(role)を受け取り、そのユーザーに対して Custom Claims を設定しています。また、Custom Token も生成して、レスポンスとして返しています。

2. クライアントサイドの実装

次に、クライアントサイドでの実装を見ていきます。Firebase のsignInWithCustomTokenメソッドを使用して、Custom Token を使ってログインします。

import firebase from "firebase/app";
import "firebase/auth";

// ... Firebaseの初期化 ...

async function signInWithRole(token) {
  await firebase.auth().signInWithCustomToken(token);
}

この関数を使用することで、初回ログイン時から Custom Claims を持った状態でログインすることができます。

3. セキュリティルールの利用

Firebase のセキュリティルールを使用して、データベースやストレージへのアクセスを制御することができます。例えば、Firestore のセキュリティルールで、adminロールを持つユーザーのみがデータを読み書きできるようにすることができます。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.role == 'admin';
    }
  }
}

⑤ まとめ

Firebase Authentication の Custom Claims は、ユーザーにカスタムの属性やロールを付与する強力なツールです。今回のハンズオンを通じて、その設定方法や利用シーンを学ぶことができました。

特に、Cloud Functions と組み合わせることで、柔軟かつ効率的な認証フローを構築することができるのが大きなメリットです。ただし、Custom Claims のサイズ制限や更新の遅延などのデメリットも念頭に置きつつ、適切に利用していくことが重要です。

最後に、技術の進化は日進月歩です。今回の内容も将来的には変わるかもしれませんので、常に公式ドキュメントや関連情報をチェックして、最新の知識を身につけていきましょう!


以上で、Firebase Authentication Custom Claims を駆使した認証フローの構築に関する解説を終わります。読んでいただき、ありがとうございました!

GitHubで編集を提案

Discussion