Configure reivindicações personalizadas nos utilizadores
Este documento explica como configurar reivindicações personalizadas em utilizadores com o Identity Platform. As reivindicações personalizadas são inseridas nos tokens de utilizador durante a autenticação. A sua app pode usar estas reivindicações para processar cenários de autorização complexos, como restringir o acesso de um utilizador a um recurso com base na respetiva função.
Configure reivindicações personalizadas
Para preservar a segurança, defina reivindicações personalizadas através do SDK de administração no seu servidor:
Se ainda não o fez, instale o SDK de administrador.
Defina a reivindicação personalizada que quer usar. No exemplo seguinte, é definida uma reivindicação personalizada no utilizador para descrever que é 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.
Ir
// 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 reivindicação personalizada da próxima vez que for enviada para o seu 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
Ir
// 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 que reivindicações personalizadas estão presentes para um utilizador:
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'))
Ir
// 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, tenha em atenção o seguinte:
- As reivindicações personalizadas não podem exceder 1000 bytes. A tentativa de transmitir reivindicações com mais de 1000 bytes resulta num erro.
- As reivindicações personalizadas são inseridas no JWT do utilizador quando o token é emitido. As novas
reivindicações não estão disponíveis até o token ser atualizado. Pode atualizar
um token de forma silenciosa chamando
user.getIdToken(true)
. - Para manter a continuidade e a segurança, defina apenas reivindicações personalizadas num ambiente de servidor seguro.
O que se segue?
- Saiba mais sobre as funções de bloqueio, que também podem ser usadas para definir reivindicações personalizadas.
- Saiba mais acerca das reivindicações personalizadas da Identity Platform na documentação de referência do SDK Admin.