ユーザーに対してカスタム クレームを構成する
このドキュメントでは、Identity Platform を使用してユーザーにカスタム クレームを構成する方法について説明します。カスタム クレームは、認証中にユーザー トークンに挿入されます。アプリでこれらのクレームを使用して、ロールに基づいてリソースに対するユーザーのアクセスを制限するなど、複雑な認証シナリオに対応できます。
カスタム クレームを設定する
セキュリティを維持するには、サーバーで Admin SDK を使用してカスタム クレームを設定します。
まだインストールしていない場合は、Admin SDK をインストールします。
使用するカスタム クレームを設定します。次の例では、管理者であることを説明するカスタム クレームがユーザーに設定されています。
Node.js
// Set admin privilege on the user corresponding to uid. getAuth() .setCustomUserClaims(uid, { admin: true }) .then(() => { // The new custom claims will propagate to the user's ID token the // next time a new one is issued. });
Java
// Set admin privilege on the user corresponding to uid. Map<String, Object> claims = new HashMap<>(); claims.put("admin", true); FirebaseAuth.getInstance().setCustomUserClaims(uid, claims); // The new custom claims will propagate to the user's ID token the // next time a new one is issued.
Python
# Set admin privilege on the user corresponding to uid. auth.set_custom_user_claims(uid, {'admin': True}) # The new custom claims will propagate to the user's ID token the # next time a new one is issued.
Go
// Get an auth client from the firebase.App client, err := app.Auth(ctx) if err != nil { log.Fatalf("error getting Auth client: %v\n", err) } // Set admin privilege on the user corresponding to uid. claims := map[string]interface{}{"admin": true} err = client.SetCustomUserClaims(ctx, uid, claims) if err != nil { log.Fatalf("error setting custom claims %v\n", err) } // The new custom claims will propagate to the user's ID token the // next time a new one is issued.
C#
// Set admin privileges on the user corresponding to uid. var claims = new Dictionary<string, object>() { { "admin", true }, }; await FirebaseAuth.DefaultInstance.SetCustomUserClaimsAsync(uid, claims); // The new custom claims will propagate to the user's ID token the // next time a new one is issued.
次回にサーバーへ送信されるカスタム クレームを検証します。
Node.js
// Verify the ID token first. getAuth() .verifyIdToken(idToken) .then((claims) => { if (claims.admin === true) { // Allow access to requested admin resource. } });
Java
// Verify the ID token first. FirebaseToken decoded = FirebaseAuth.getInstance().verifyIdToken(idToken); if (Boolean.TRUE.equals(decoded.getClaims().get("admin"))) { // Allow access to requested admin resource. }
Python
# Verify the ID token first. claims = auth.verify_id_token(id_token) if claims['admin'] is True: # Allow access to requested admin resource. pass
Go
// Verify the ID token first. token, err := client.VerifyIDToken(ctx, idToken) if err != nil { log.Fatal(err) } claims := token.Claims if admin, ok := claims["admin"]; ok { if admin.(bool) { //Allow access to requested admin resource. } }
C#
// Verify the ID token first. FirebaseToken decoded = await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(idToken); object isAdmin; if (decoded.Claims.TryGetValue("admin", out isAdmin)) { if ((bool)isAdmin) { // Allow access to requested admin resource. } }
ユーザーに対してどのようなカスタム クレームが存在するかを確認するには、次を実行します。
Node.js
// Lookup the user associated with the specified uid. getAuth() .getUser(uid) .then((userRecord) => { // The claims can be accessed on the user record. console.log(userRecord.customClaims['admin']); });
Java
// Lookup the user associated with the specified uid. UserRecord user = FirebaseAuth.getInstance().getUser(uid); System.out.println(user.getCustomClaims().get("admin"));
Python
# Lookup the user associated with the specified uid. user = auth.get_user(uid) # The claims can be accessed on the user record. print(user.custom_claims.get('admin'))
Go
// Lookup the user associated with the specified uid. user, err := client.GetUser(ctx, uid) if err != nil { log.Fatal(err) } // The claims can be accessed on the user record. if admin, ok := user.CustomClaims["admin"]; ok { if admin.(bool) { log.Println(admin) } }
C#
// Lookup the user associated with the specified uid. UserRecord user = await FirebaseAuth.DefaultInstance.GetUserAsync(uid); Console.WriteLine(user.CustomClaims["admin"]);
カスタム クレームを設定する際は、次の点に注意してください。
- カスタム クレームのサイズは 1000 バイト以下でなければなりません。1,000 バイトを超えるクレームを渡そうとすると、エラーが発生します。
- カスタム クレームは、トークンが発行されたときにユーザー JWT に挿入されます。トークンが更新されるまで、新しいクレームは使用できません。
user.getIdToken(true)
を呼び出すことにより、トークンをサイレントに更新できます。 - 継続性とセキュリティを維持するために、安全なサーバー環境でのみカスタム クレームを設定してください。
次のステップ
- ブロッキング関数の詳細。これはカスタム クレームを設定するためにも使用できます。
- Admin SDK リファレンス ドキュメントで、Identity Platform のカスタム クレームの詳細を確認する。