Configurar declarações personalizadas para usuários
Neste documento, você verá como configurar declarações personalizadas em usuários com o Identity Platform. As declarações personalizadas são inseridas em tokens de usuários durante a autenticação. O aplicativo pode usar essas declarações para lidar com cenários de autorização complexos, como a restrição do acesso de um usuário a um recurso com base no papel dele.
Configurar declarações personalizadas
Para preservar a segurança, defina declarações personalizadas usando o SDK Admin no seu servidor:
Instale o SDK Admin, caso ainda não tenha feito isso.
Defina a declaração personalizada que você quer usar. No exemplo a seguir, uma declaração personalizada é definida no usuário para descrever que ele é um 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.
Valide a declaração personalizada na próxima vez que ela for enviada ao 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 quais declarações personalizadas estão presentes para um usuário:
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"]);
Ao configurar reivindicações personalizadas, lembre-se do seguinte:
- As declarações personalizadas não podem exceder 1.000 bytes. Tentativa de transmitir reivindicações com mais de 1.000 bytes resulta em erro.
- As declarações personalizadas são inseridas no JWT do usuário quando o token é emitido. Novas
reivindicações não estarão disponíveis até que o token seja atualizado. É possível atualizar
um token silenciosamente chamando
user.getIdToken(true)
. - Para manter a continuidade e a segurança, defina apenas declarações personalizadas em um ambiente de servidor seguro.
A seguir
- Saiba mais sobre as funções de bloqueio, que também podem ser usadas para definir declarações personalizadas.
- Saiba mais sobre as declarações personalizadas do Identity Platform na documentação de referência do SDK Admin.