Firebase Admin SDK מספק ממשק API לניהול משתמשי Firebase Authentication עם הרשאות מורחבות. באמצעות ה-API לניהול משתמשי אדמין תוכלו להשלים באופן פרוגרמטי את המשימות הבאות בסביבת שרת מאובטחת:
- יצירת משתמשים חדשים ללא ויסות נתונים (throttle) או הגבלת קצב.
- חיפוש משתמשים לפי קריטריונים שונים, כמו uid, email או מספר טלפון.
- הצגת רשימה של כל המשתמשים בפרויקט מסוים בקבוצות.
- גישה למטא-נתונים של משתמשים, כולל תאריך יצירת החשבון ותאריך הכניסה האחרון.
- למחוק משתמשים בלי לדרוש את הסיסמה הקיימת שלהם.
- לעדכן את מאפייני המשתמש – כולל הסיסמה שלו – בלי להיכנס לחשבון שלו.
- אימות אימיילים בלי צורך לעבור את תהליכי הפעולה מחוץ למסגרת לאימות אימיילים.
- לשנות את כתובת האימייל של משתמש בלי לשלוח קישורים לאימייל כדי לבטל את השינויים האלה.
- ליצור משתמש חדש עם מספר טלפון בלי לעבור את תהליך האימות ב-SMS.
- שינוי מספר הטלפון של המשתמש בלי לבצע את תהליך האימות ב-SMS.
- להקצות משתמשים אופליין במצב מושבת, ולאחר מכן לקבוע מתי להפעיל אותם.
- פיתוח מסופים מותאמים אישית של משתמשים שמותאמים למערכת ניהול המשתמשים של אפליקציה ספציפית.
לפני שמתחילים
כדי להשתמש ב-API לניהול משתמשים שסופק על ידי Firebase Admin SDK, נדרש חשבון שירות. בהוראות ההגדרה מוסבר איך מפעילים את Admin SDK.
אחזור נתוני משתמשים
הדרך העיקרית לזהות משתמש היא לפי uid
, מזהה ייחודי של המשתמש. ב-Admin SDK יש שיטה שמאפשרת לאחזר את פרטי הפרופיל של משתמשים לפי uid
שלהם:
Node.js
getAuth()
.getUser(uid)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUser(uid);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getUid());
Python
from firebase_admin import auth
user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(user.uid))
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)
}
u, err := client.GetUser(ctx, uid)
if err != nil {
log.Fatalf("error getting user %s: %v\n", uid, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserAsync(uid);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
השיטה הזו מחזירה אובייקט UserRecord
של המשתמש התואם ל-uid
שסופק לשיטה.
אם ה-uid
שצוין לא שייך למשתמש קיים או שלא ניתן לאחזר את המשתמש מכל סיבה אחרת, השיטה שלמעלה גורמת לשגיאה.
רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Auth API.
במקרים מסוימים תופיע כתובת האימייל של המשתמש במקום uid
שלו. Firebase Admin SDK תומך בחיפוש פרטי משתמשים באמצעות כתובת אימייל:
Node.js
getAuth()
.getUserByEmail(email)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getEmail());
Python
from firebase_admin import auth
user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(user.uid))
Go
u, err := client.GetUserByEmail(ctx, email)
if err != nil {
log.Fatalf("error getting user by email %s: %v\n", email, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
ה-method הזה מחזירה אובייקט UserRecord
למשתמש שתואם לכתובת האימייל שסופקה.
אם כתובת האימייל שסיפקתם לא שייכת למשתמש קיים או שלא ניתן לאחזר את המשתמש מכל סיבה אחרת, ה-Admin SDK יקפיץ הודעת שגיאה. רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
במקרים אחרים, יופיע מספר הטלפון של המשתמש במקום uid
שלו. SDK של Firebase לאדמינים תומך בחיפוש פרטי משתמשים באמצעות מספר טלפון:
Node.js
getAuth()
.getUserByPhoneNumber(phoneNumber)
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
UserRecord userRecord = FirebaseAuth.getInstance().getUserByPhoneNumber(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getPhoneNumber());
Python
from firebase_admin import auth
user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(user.uid))
Go
u, err := client.GetUserByPhoneNumber(ctx, phone)
if err != nil {
log.Fatalf("error getting user by phone %s: %v\n", phone, err)
}
log.Printf("Successfully fetched user data: %v\n", u)
C#
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");
השיטה הזו מחזירה אובייקט UserRecord
של המשתמש שמשויך למספר הטלפון שצוין.
אם מספר הטלפון שצוין לא שייך למשתמש קיים או שלא ניתן לאחזר את המשתמש מכל סיבה אחרת, ה-Admin SDK יקפיץ הודעת שגיאה. רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
אחזור של נתוני משתמשים בכמות גדולה
באמצעות ה-SDK של Firebase Admin אפשר גם לאחזר רשימת משתמשים על סמך המזהים שאתם מספקים. אפשר לזהות משתמשים לפי מזהה המשתמש, כתובת האימייל או מספר הטלפון שלהם. אפשר לספק עד 100 מזהים בקריאה אחת. המזהים יכולים להכיל שילוב של סוגים:
Node.js
getAuth()
.getUsers([
{ uid: 'uid1' },
{ email: 'user2@example.com' },
{ phoneNumber: '+15555550003' },
{ providerId: 'google.com', providerUid: 'google_uid4' },
])
.then((getUsersResult) => {
console.log('Successfully fetched user data:');
getUsersResult.users.forEach((userRecord) => {
console.log(userRecord);
});
console.log('Unable to find users corresponding to these identifiers:');
getUsersResult.notFound.forEach((userIdentifier) => {
console.log(userIdentifier);
});
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
Java
GetUsersResult result = FirebaseAuth.getInstance().getUsersAsync(Arrays.asList(
new UidIdentifier("uid1"),
new EmailIdentifier("user2@example.com"),
new PhoneIdentifier("+15555550003"),
new ProviderIdentifier("google.com", "google_uid4"))).get();
System.out.println("Successfully fetched user data:");
for (UserRecord user : result.getUsers()) {
System.out.println(user.getUid());
}
System.out.println("Unable to find users corresponding to these identifiers:");
for (UserIdentifier uid : result.getNotFound()) {
System.out.println(uid);
}
Python
from firebase_admin import auth
result = auth.get_users([
auth.UidIdentifier('uid1'),
auth.EmailIdentifier('user2@example.com'),
auth.PhoneIdentifier(+15555550003),
auth.ProviderIdentifier('google.com', 'google_uid4')
])
print('Successfully fetched user data:')
for user in result.users:
print(user.uid)
print('Unable to find users corresponding to these identifiers:')
for uid in result.not_found:
print(uid)
Go
getUsersResult, err := client.GetUsers(ctx, []auth.UserIdentifier{
auth.UIDIdentifier{UID: "uid1"},
auth.EmailIdentifier{Email: "user@example.com"},
auth.PhoneIdentifier{PhoneNumber: "+15555551234"},
auth.ProviderIdentifier{ProviderID: "google.com", ProviderUID: "google_uid1"},
})
if err != nil {
log.Fatalf("error retriving multiple users: %v\n", err)
}
log.Printf("Successfully fetched user data:")
for _, u := range getUsersResult.Users {
log.Printf("%v", u)
}
log.Printf("Unable to find users corresponding to these identifiers:")
for _, id := range getUsersResult.NotFound {
log.Printf("%v", id)
}
C#
GetUsersResult result = await FirebaseAuth.DefaultInstance.GetUsersAsync(
new List<UserIdentifier>
{
new UidIdentifier("uid1"),
new EmailIdentifier("user2@example.com"),
new PhoneIdentifier("+15555550003"),
new ProviderIdentifier("google.com", "google_uid4"),
});
Console.WriteLine("Successfully fetched user data:");
foreach (UserRecord user in result.Users)
{
Console.WriteLine($"User: {user.Uid}");
}
Console.WriteLine("Unable to find users corresponding to these identifiers:");
foreach (UserIdentifier uid in result.NotFound)
{
Console.WriteLine($"{uid}");
}
ה-method הזה מחזיר רשימה בגודל זהה לזה של רשימת הקלט, וכל רשומה מכילה את הערך התואם של UserRecord
או שגיאה שמציינת למה לא ניתן היה לחפש את המזהה הזה. לרשימה המלאה של קודי השגיאה, כולל תיאורים ושלבים לפתרון, ראו שגיאות Authentication API של אדמין.
יצירת משתמש
ב-Admin SDK יש שיטה שמאפשרת ליצור משתמש Firebase Authentication חדש. ה-method הזה מקבל אובייקט שמכיל את פרטי הפרופיל שצריך לכלול בחשבון המשתמש החדש שנוצר:
Node.js
getAuth()
.createUser({
email: 'user@example.com',
emailVerified: false,
phoneNumber: '+11234567890',
password: 'secretPassword',
displayName: 'John Doe',
photoURL: 'http://www.example.com/12345678/photo.png',
disabled: false,
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully created new user:', userRecord.uid);
})
.catch((error) => {
console.log('Error creating new user:', error);
});
Java
CreateRequest request = new CreateRequest()
.setEmail("user@example.com")
.setEmailVerified(false)
.setPassword("secretPassword")
.setPhoneNumber("+11234567890")
.setDisplayName("John Doe")
.setPhotoUrl("http://www.example.com/12345678/photo.png")
.setDisabled(false);
UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());
Python
user = auth.create_user(
email='user@example.com',
email_verified=False,
phone_number='+15555550100',
password='secretPassword',
display_name='John Doe',
photo_url='http://www.example.com/12345678/photo.png',
disabled=False)
print('Sucessfully created new user: {0}'.format(user.uid))
Go
params := (&auth.UserToCreate{}).
Email("user@example.com").
EmailVerified(false).
PhoneNumber("+15555550100").
Password("secretPassword").
DisplayName("John Doe").
PhotoURL("http://www.example.com/12345678/photo.png").
Disabled(false)
u, err := client.CreateUser(ctx, params)
if err != nil {
log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Email = "user@example.com",
EmailVerified = false,
PhoneNumber = "+11234567890",
Password = "secretPassword",
DisplayName = "John Doe",
PhotoUrl = "http://www.example.com/12345678/photo.png",
Disabled = false,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");
כברירת מחדל, Firebase Authentication ייצור uid
אקראי למשתמש החדש. אם אתם רוצים במקום זאת לציין uid
משלכם למשתמש החדש, אפשר לכלול אותו כארגומנט שמועבר לשיטה ליצירת משתמש:
Node.js
getAuth()
.createUser({
uid: 'some-uid',
email: 'user@example.com',
phoneNumber: '+11234567890',
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully created new user:', userRecord.uid);
})
.catch((error) => {
console.log('Error creating new user:', error);
});
Java
CreateRequest request = new CreateRequest()
.setUid("some-uid")
.setEmail("user@example.com")
.setPhoneNumber("+11234567890");
UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());
Python
user = auth.create_user(
uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(user.uid))
Go
params := (&auth.UserToCreate{}).
UID(uid).
Email("user@example.com").
PhoneNumber("+15555550100")
u, err := client.CreateUser(ctx, params)
if err != nil {
log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Uid = "some-uid",
Email = "user@example.com",
PhoneNumber = "+11234567890",
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");
אפשר לספק כל שילוב של המאפיינים הבאים:
טבלה 1. מאפיינים שנתמכים על ידי הפעולה של יצירת משתמש
נכס | סוג | תיאור |
---|---|---|
uid |
מחרוזת |
השדה uid שצריך להקצות למשתמש החדש שנוצר. המחרוזת חייבת להיות באורך של 1 עד 128 תווים, כולל. אם לא מציינים ערך, המערכת תיצור ערך uid אקראי באופן אוטומטי. משך
uid קצר יותר מניב ביצועים טובים יותר.
|
email |
מחרוזת | כתובת האימייל הראשית של המשתמש. חייבת להיות כתובת אימייל חוקית. |
emailVerified |
בוליאני |
האם כתובת האימייל הראשית של המשתמש מאומתת או לא. אם לא מציינים ערך, ברירת המחדל היא false .
|
phoneNumber |
מחרוזת | מספר הטלפון הראשי של המשתמש. מספר הטלפון חייב להיות תקין ותואם למפרט E.164. |
password |
מחרוזת | הסיסמה של המשתמש ללא גיבוב. היא חייבת לכלול לפחות שישה תווים. |
displayName |
מחרוזת | השם המוצג של המשתמשים. |
photoURL |
מחרוזת | כתובת ה-URL של תמונת המשתמש. |
disabled |
בוליאני |
האם המשתמש מושבת או לא. true לצורך השבתה, false לצורך הפעלה. אם לא מציינים ערך, ברירת המחדל היא false .
|
שיטת יצירת המשתמש מחזירה אובייקט UserRecord
של המשתמש החדש שנוצר.
אם uid
, כתובת האימייל או מספר הטלפון שסיפקתם כבר נמצאים בשימוש אצל משתמש קיים, או אם אי אפשר ליצור את המשתמש מסיבה אחרת, השיטה שלמעלה תיכשל ותופיע הודעת שגיאה. רשימה מלאה של קודי השגיאה, כולל תיאורים ושלבי פתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
עדכון משתמש
Firebase Admin SDK מאפשר לשנות נתונים של משתמש קיים. עליכם לציין uid
יחד עם המאפיינים שיש לעדכן עבור המשתמש:
Node.js
getAuth()
.updateUser(uid, {
email: 'modifiedUser@example.com',
phoneNumber: '+11234567890',
emailVerified: true,
password: 'newPassword',
displayName: 'Jane Doe',
photoURL: 'http://www.example.com/12345678/photo.png',
disabled: true,
})
.then((userRecord) => {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully updated user', userRecord.toJSON());
})
.catch((error) => {
console.log('Error updating user:', error);
});
Java
UpdateRequest request = new UpdateRequest(uid)
.setEmail("user@example.com")
.setPhoneNumber("+11234567890")
.setEmailVerified(true)
.setPassword("newPassword")
.setDisplayName("Jane Doe")
.setPhotoUrl("http://www.example.com/12345678/photo.png")
.setDisabled(true);
UserRecord userRecord = FirebaseAuth.getInstance().updateUser(request);
System.out.println("Successfully updated user: " + userRecord.getUid());
Python
user = auth.update_user(
uid,
email='user@example.com',
phone_number='+15555550100',
email_verified=True,
password='newPassword',
display_name='John Doe',
photo_url='http://www.example.com/12345678/photo.png',
disabled=True)
print('Sucessfully updated user: {0}'.format(user.uid))
Go
params := (&auth.UserToUpdate{}).
Email("user@example.com").
EmailVerified(true).
PhoneNumber("+15555550100").
Password("newPassword").
DisplayName("John Doe").
PhotoURL("http://www.example.com/12345678/photo.png").
Disabled(true)
u, err := client.UpdateUser(ctx, uid, params)
if err != nil {
log.Fatalf("error updating user: %v\n", err)
}
log.Printf("Successfully updated user: %v\n", u)
C#
UserRecordArgs args = new UserRecordArgs()
{
Uid = uid,
Email = "modifiedUser@example.com",
PhoneNumber = "+11234567890",
EmailVerified = true,
Password = "newPassword",
DisplayName = "Jane Doe",
PhotoUrl = "http://www.example.com/12345678/photo.png",
Disabled = true,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.UpdateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully updated user: {userRecord.Uid}");
אפשר לספק כל שילוב של המאפיינים הבאים:
טבלה 2. מאפיינים שנתמכים על ידי פעולת העדכון של המשתמש
נכס | סוג | תיאור |
---|---|---|
email |
מחרוזת | כתובת האימייל הראשית החדשה של המשתמש. חייבת להיות כתובת אימייל חוקית. |
emailVerified |
בוליאני |
האם כתובת האימייל הראשית של המשתמש מאומתת או לא. אם לא מציינים ערך, ברירת המחדל היא false .
|
phoneNumber |
מחרוזת |
מספר הטלפון הראשי החדש של המשתמש. מספר הטלפון חייב להיות תקין ותואם למפרט E.164. מגדירים את הערך null כדי למחוק את מספר הטלפון הקיים של המשתמש.
|
password |
מחרוזת | הסיסמה החדשה של המשתמש, ללא גיבוב. אורך השם צריך להיות שישה תווים לפחות. |
displayName |
מחרוזת | null |
השם המוצג החדש של המשתמשים. מגדירים את הערך null כדי למחוק את שם התצוגה הקיים של המשתמש.
|
photoURL |
מחרוזת | null |
כתובת ה-URL החדשה של התמונה של המשתמשים. מגדירים את הערך null כדי למחוק את כתובת ה-URL הקיימת של התמונה של המשתמש. אם היא לא null , חייבת להיות כתובת URL חוקית.
|
disabled |
בוליאני |
האם המשתמש מושבת או לא. true מושבת; false מופעל.
|
ה-method 'עדכון של המשתמש' מחזירה אובייקט UserRecord
מעודכן כשהעדכון מסתיים.
אם הערך של uid
שצוין לא תואם למשתמש קיים, אם כתובת האימייל או מספר הטלפון שצוינו כבר נמצאים בשימוש אצל משתמש קיים, או אם אי אפשר לעדכן את המשתמש מסיבה אחרת, השיטה שלמעלה תיכשל עם הודעת שגיאה. רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
מחיקת משתמש
ה-SDK של Firebase Admin מאפשר למחוק משתמשים קיימים לפי uid
:
Node.js
getAuth()
.deleteUser(uid)
.then(() => {
console.log('Successfully deleted user');
})
.catch((error) => {
console.log('Error deleting user:', error);
});
Java
FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");
Python
auth.delete_user(uid)
print('Successfully deleted user')
Go
err := client.DeleteUser(ctx, uid)
if err != nil {
log.Fatalf("error deleting user: %v\n", err)
}
log.Printf("Successfully deleted user: %s\n", uid)
C#
await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");
כשהמחיקה מסתיימת בהצלחה, השיטה delete user מחזירה תוצאה ריקה.
אם הערך של uid
שצוין לא תואם למשתמש קיים, או אם אי אפשר למחוק את המשתמש מסיבה אחרת, שגיאה תוצג ב-method delete user.
רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
מחיקת כמה משתמשים
אפשר גם למחוק כמה משתמשים בו-זמנית באמצעות ה-SDK של Firebase Admin. עם זאת, חשוב לזכור: שימוש בשיטות כמו deleteUsers(uids)
כדי למחוק כמה משתמשים בו-זמנית לא יפעיל טיפולי אירועים של onDelete()
עבור Cloud Functions for Firebase.
הסיבה לכך היא שמחיקה בכמות גדולה לא מפעילה אירוע מחיקה של משתמש לכל משתמש. אם רוצים שהאירועים של מחיקה של משתמשים יופעלו לכל משתמש שנמחק, צריך למחוק משתמשים אחד אחרי השני.
Node.js
getAuth()
.deleteUsers([uid1, uid2, uid3])
.then((deleteUsersResult) => {
console.log(`Successfully deleted ${deleteUsersResult.successCount} users`);
console.log(`Failed to delete ${deleteUsersResult.failureCount} users`);
deleteUsersResult.errors.forEach((err) => {
console.log(err.error.toJSON());
});
})
.catch((error) => {
console.log('Error deleting users:', error);
});
Java
DeleteUsersResult result = FirebaseAuth.getInstance().deleteUsersAsync(
Arrays.asList("uid1", "uid2", "uid3")).get();
System.out.println("Successfully deleted " + result.getSuccessCount() + " users");
System.out.println("Failed to delete " + result.getFailureCount() + " users");
for (ErrorInfo error : result.getErrors()) {
System.out.println("error #" + error.getIndex() + ", reason: " + error.getReason());
}
Python
from firebase_admin import auth
result = auth.delete_users(["uid1", "uid2", "uid3"])
print('Successfully deleted {0} users'.format(result.success_count))
print('Failed to delete {0} users'.format(result.failure_count))
for err in result.errors:
print('error #{0}, reason: {1}'.format(result.index, result.reason))
Go
deleteUsersResult, err := client.DeleteUsers(ctx, []string{"uid1", "uid2", "uid3"})
if err != nil {
log.Fatalf("error deleting users: %v\n", err)
}
log.Printf("Successfully deleted %d users", deleteUsersResult.SuccessCount)
log.Printf("Failed to delete %d users", deleteUsersResult.FailureCount)
for _, err := range deleteUsersResult.Errors {
log.Printf("%v", err)
}
C#
DeleteUsersResult result = await FirebaseAuth.DefaultInstance.DeleteUsersAsync(new List<string>
{
"uid1",
"uid2",
"uid3",
});
Console.WriteLine($"Successfully deleted {result.SuccessCount} users.");
Console.WriteLine($"Failed to delete {result.FailureCount} users.");
foreach (ErrorInfo err in result.Errors)
{
Console.WriteLine($"Error #{err.Index}, reason: {err.Reason}");
}
השיטה delete users מחזירה רשימה של כשלים של משתמשים שלא ניתן למחוק. רשימה מלאה של קודי השגיאה, כולל תיאורים והוראות לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
הצגת רשימה של כל המשתמשים
Firebase Admin SDK מאפשר לאחזר את כל רשימת המשתמשים בקבוצות:
Node.js
const listAllUsers = (nextPageToken) => {
// List batch of users, 1000 at a time.
getAuth()
.listUsers(1000, nextPageToken)
.then((listUsersResult) => {
listUsersResult.users.forEach((userRecord) => {
console.log('user', userRecord.toJSON());
});
if (listUsersResult.pageToken) {
// List next batch of users.
listAllUsers(listUsersResult.pageToken);
}
})
.catch((error) => {
console.log('Error listing users:', error);
});
};
// Start listing users from the beginning, 1000 at a time.
listAllUsers();
Java
// Start listing users from the beginning, 1000 at a time.
ListUsersPage page = FirebaseAuth.getInstance().listUsers(null);
while (page != null) {
for (ExportedUserRecord user : page.getValues()) {
System.out.println("User: " + user.getUid());
}
page = page.getNextPage();
}
// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
page = FirebaseAuth.getInstance().listUsers(null);
for (ExportedUserRecord user : page.iterateAll()) {
System.out.println("User: " + user.getUid());
}
Python
# Start listing users from the beginning, 1000 at a time.
page = auth.list_users()
while page:
for user in page.users:
print('User: ' + user.uid)
# Get next batch of users.
page = page.get_next_page()
# Iterate through all users. This will still retrieve users in batches,
# buffering no more than 1000 users in memory at a time.
for user in auth.list_users().iterate_all():
print('User: ' + user.uid)
Go
// Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API
iter := client.Users(ctx, "")
for {
user, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("error listing users: %s\n", err)
}
log.Printf("read user user: %v\n", user)
}
// Iterating by pages 100 users at a time.
// Note that using both the Next() function on an iterator and the NextPage()
// on a Pager wrapping that same iterator will result in an error.
pager := iterator.NewPager(client.Users(ctx, ""), 100, "")
for {
var users []*auth.ExportedUserRecord
nextPageToken, err := pager.NextPage(&users)
if err != nil {
log.Fatalf("paging error %v\n", err)
}
for _, u := range users {
log.Printf("read user user: %v\n", u)
}
if nextPageToken == "" {
break
}
}
C#
// Start listing users from the beginning, 1000 at a time.
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (await responses.MoveNextAsync())
{
ExportedUserRecords response = responses.Current;
foreach (ExportedUserRecord user in response.Users)
{
Console.WriteLine($"User: {user.Uid}");
}
}
// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
var enumerator = FirebaseAuth.DefaultInstance.ListUsersAsync(null).GetAsyncEnumerator();
while (await enumerator.MoveNextAsync())
{
ExportedUserRecord user = enumerator.Current;
Console.WriteLine($"User: {user.Uid}");
}
כל קבוצת תוצאות מכילה רשימה של משתמשים ואת אסימון הדף הבא, שמשמש להצגת הקבוצה הבאה של המשתמשים. כשכל המשתמשים כבר מופיעים ברשימה, לא מוחזר pageToken
.
אם לא מציינים שדה maxResults
, נעשה שימוש בערך ברירת המחדל של 1,000 משתמשים בכל קבוצה.
זה גם המספר המקסימלי של משתמשים שאפשר להוסיף לרשימה בכל פעם. כל ערך גדול מהערך המקסימלי יגרום להצגת שגיאה בארגומנט.
אם לא מציינים את הערך pageToken
, הפעולה תציג את רשימת המשתמשים מההתחלה, לפי הסדר של uid
.
לרשימה המלאה של קודי השגיאות, כולל תיאורים ושלבים לפתרון, ראו שגיאות ב-API Authentication של אדמין.
גיבוב של סיסמאות של משתמשים שמפורטים
ה-API הזה מחזיר גם את passwordSalt
ו-passwordHash
שעברו גיבוב על ידי הקצה העורפי של אימות Firebase למשתמשים עם סיסמה, אם לחשבון המשתמש או לחשבון השירות ששימשו ליצירת אסימון הגישה של הבקשה ל-OAuth יש את ההרשאה firebaseauth.configs.getHashConfig
. אחרת, הערכים של passwordHash
ו-passwordSalt
לא יוגדרו.
בגלל אופי המידע הרגיש של גיבוב הסיסמאות, לחשבון השירות של Firebase Admin SDK אין את ההרשאה firebaseauth.configs.getHashConfig
כברירת מחדל. אי אפשר להוסיף הרשאה ישירות לחשבון משתמש או לחשבון שירות, אבל אפשר לעשות זאת באופן עקיף על ידי יצירת תפקיד IAM בהתאמה אישית.
כדי ליצור את תפקיד ה-IAM בהתאמה אישית:
- נכנסים לדף Roles בחלונית IAM &admin במסוף Google Cloud.
- בוחרים את הפרויקט מהתפריט הנפתח שבחלק העליון של הדף.
- לוחצים על CREATE ROLE (יצירת תפקיד).
- לוחצים על הוספת הרשאות.
- מחפשים את ההרשאה
firebaseauth.configs.getHashConfig
ומסמנים את התיבה שלה. - לוחצים על הוספה.
- לוחצים על CREATE (יצירה) כדי לסיים את יצירת התפקיד החדש.
מוסיפים את התפקיד בהתאמה אישית שנוצר לחשבון המשתמש או לחשבון השירות בדף IAM:
- בחלונית IAM & admin, בוחרים באפשרות IAM.
- בוחרים את חשבון השירות או חשבון המשתמש שרוצים לערוך מרשימת החברים.
- לוחצים על ADD ANOTHER ROLE.
- מחפשים את התפקיד החדש בהתאמה אישית שיצרתם.
- לוחצים על שמירה.