הגדרת טענות מותאמות אישית לגבי משתמשים

במאמר הזה מוסבר איך להגדיר טענות מותאמות אישית לגבי משתמשים ב-Identity Platform. הצהרות מותאמות אישית מוכנסות לאסימוני משתמשים במהלך האימות. האפליקציה יכולה להשתמש בטענות האלה כדי לטפל בתרחישי הרשאה מורכבים, כמו הגבלת הגישה של משתמש למשאב על סמך התפקיד שלו.

הגדרת טענות מותאמות אישית

כדי לשמור על האבטחה, צריך להגדיר טענות מותאמות אישית באמצעות SDK לאדמינים בשרת:

  1. אם עדיין לא עשיתם זאת, מתקינים את SDK לאדמינים.

  2. מגדירים את הטענה המותאמת אישית שרוצים להשתמש בה. בדוגמה הבאה, טענה בהתאמה אישית מוגדרת לגבי המשתמש כדי לתאר שהוא אדמין:

    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.
  3. בפעם הבאה שהטענה המותאמת אישית תישלח לשרת שלכם, תצטרכו לאמת אותה:

    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.
        }
    }
    
  4. כדי לראות אילו טענות מותאמות אישית קיימות עבור משתמש:

    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"]);

כשמגדירים טענות מותאמות אישית, חשוב לזכור את הנקודות הבאות:

  • הגודל של טענות בהתאמה אישית לא יכול להיות יותר מ-1,000 בייט. ניסיון להעביר טענות בגודל של יותר מ-1,000 בייט יוביל לשגיאה.
  • הצהרות מותאמות אישית מוכנסות ל-JWT של המשתמש כשהאסימון מונפק. אי אפשר להשתמש בטענות חדשות עד לרענון האסימון. כדי לרענן את הטוקן באופן שקוף, אפשר לקרוא ל-user.getIdToken(true).
  • כדי לשמור על המשכיות ועל אבטחה, צריך להגדיר טענות מותאמות אישית רק בסביבת שרת מאובטחת.

המאמרים הבאים