Firebase Authentication Custom Claimsを駆使した認証フローの構築
こんにちは!普段は Firebase や Next.js、TypeScript などの技術を駆使して開発をしているエンジニアのおおさきです。今日は、Firebase Authentication の Custom Claims を使った認証フローについて、ハンズオン形式で解説していきます。
①custom claims とは?
Firebase Authentication の Custom Claims とは、ユーザーの ID トークンに追加できるカスタム属性のことを指します。これにより、ユーザーに特定の役割や権限を付与することができます。例えば、admin
やeditor
のようなロールをユーザーに割り当てることが可能です。
②custom claims のユースケース
Custom Claims の主なユースケースは、以下のようなものが考えられます。
-
ロールベースのアクセス制御: ユーザーに
admin
やeditor
のようなロールを割り当て、特定のリソースへのアクセスを制御する。 - 特定の機能の制限: 例えば、プレミアムユーザーのみが利用できる機能を提供する際に、Custom Claims を使ってユーザーのステータスを識別する。
- セキュリティルールの強化: Firebase のセキュリティルールで Custom Claims を参照し、データベースやストレージへのアクセスを制御する。
③custom claims を使うメリット・デメリット
メリット:
- 柔軟性: ユーザーごとに異なる属性やロールを付与することができる。
- セキュリティ: Firebase のセキュリティルールと組み合わせることで、データのアクセス制御を強化できる。
- 効率的な認証フロー: Custom Token を使用して、初回ログイン時から特定のロールや属性を持った状態でログインさせることができる。
デメリット:
- サイズ制限: Custom Claims のサイズは、全体で最大 1KB という制限がある。
- 更新の遅延: 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 を駆使した認証フローの構築に関する解説を終わります。読んでいただき、ありがとうございました!
Discussion