Benutzerdefinierte Ansprüche auf Nutzer konfigurieren

In diesem Dokument wird erläutert, wie benutzerdefinierte Anforderungen für Nutzer mit Identity Platform konfiguriert werden. Benutzerdefinierte Anforderungen werden während der Authentifizierung in Nutzer-Tokens eingefügt. Ihre App kann diese Anforderungen verwenden, um komplexe Autorisierungsszenarien zu verarbeiten, z. B. um den Zugriff eines Nutzers auf eine Ressource entsprechend seiner Rolle einzuschränken.

Benutzerdefinierte Ansprüche einrichten

Um die Sicherheit zu wahren, kannst du mit dem Admin SDK benutzerdefinierte Ansprüche auf deinem Server:

  1. Installieren Sie das Admin SDK, falls noch nicht geschehen.

  2. Wählen Sie die benutzerdefinierte Anforderung aus, die Sie verwenden möchten. Im folgenden Beispiel wird eine benutzerdefinierte Anforderung auf den Nutzer festgelegt, um zu beschreiben, dass er ein Administrator ist:

    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. Validieren Sie den benutzerdefinierten Anforderung bei der nächsten Übermittlung an Ihren Server:

    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. So bestimmen Sie, welche benutzerdefinierten Anforderungen für einen Nutzer vorhanden sind:

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

Beachten Sie beim Einrichten benutzerdefinierter Berechtigungen Folgendes:

  • Benutzerdefinierte Anforderungen dürfen nicht größer als 1000 Byte sein. Der Versuch, Ansprüche mit mehr als 1.000 Byte zu übergeben, führt zu einem Fehler.
  • Benutzerdefinierte Anforderungen werden in das JWT des Nutzers eingefügt, wenn das Token ausgegeben wird. Neue Anforderungen sind erst verfügbar, wenn das Token aktualisiert wurde. Sie können ein Token stumm aktualisieren, indem Sie user.getIdToken(true) aufrufen.
  • Legen Sie zur Gewährleistung der Kontinuität und Sicherheit benutzerdefinierte Anforderungen nur in einer sicheren Serverumgebung fest.

Nächste Schritte