Configura reclamos personalizados para los usuarios
En este documento se explica cómo configurar reclamaciones personalizadas en los usuarios con Identity Platform. Las reclamaciones personalizadas se insertan en los tokens de usuario durante la autenticación. Tu app puede usar estas reclamaciones para manejar situaciones complejas de autorización, como restringir el acceso de un usuario a un recurso según su función.
Configura reclamos personalizados
Para conservar la seguridad, configura las reclamaciones personalizadas con el SDK de Admin en tu servidor:
Si aún no lo hiciste, instala el SDK de Admin.
Configura la reclamación personalizada que deseas usar. En el siguiente ejemplo, se establece una reclamación personalizada en el usuario para describir que es un administrador:
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.
Valida la reclamación personalizada la próxima vez que se envíe a tu servidor:
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. } }
Para determinar qué reclamaciones personalizadas están presentes para un usuario, haz lo siguiente:
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"]);
Cuando configures reclamos personalizados, ten en cuenta lo siguiente:
- El tamaño de los reclamos personalizados no puede ser superior a 1,000 bytes. Si intentas pasar reclamaciones de más de 1,000 bytes, se producirá un error.
- Las reclamaciones personalizadas se insertan en el JWT de usuario cuando se emite el token. Las reclamaciones nuevas no están disponibles hasta que se actualice el token. Puedes actualizar un token de forma silenciosa si llamas a
user.getIdToken(true)
. - Para mantener la continuidad y la seguridad, solo establece reclamaciones personalizadas en un entorno de servidor seguro.
¿Qué sigue?
- Obtén más información sobre las funciones de bloqueo, que también se pueden usar para establecer reclamos personalizados.
- Obtén más información sobre las reclamaciones personalizadas de Identity Platform en la documentación de referencia del SDK de Admin.