Benutzerdefinierte Anforderungen für 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

Legen Sie zur Aufrechterhaltung der Sicherheit benutzerdefinierte Anforderungen mit dem Admin SDK auf Ihrem Server fest:

  1. Falls noch nicht geschehen, installieren Sie das Admin SDK.

  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.

    Einfach loslegen (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

    Einfach loslegen (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'))

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

Beim Einrichten von benutzerdefinierten Ansprüchen solltest du Folgendes beachten:

  • Benutzerdefinierte Anforderungen dürfen nicht größer als 1000 Byte sein. Der Versuch, Anforderungen zu übergeben, die größer als 1.000 Byte sind, 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