ה-SDK של Firebase לאדמינים מספק API לניהול משתמשי Firebase Authentication עם הרשאות מורחבות. באמצעות ה-Management API לניהול משתמשים עם הרשאת אדמין, אתם יכולים לבצע את המשימות הבאות באופן פרוגרמטי מסביבת שרת מאובטחת:
- ליצור משתמשים חדשים בלי הגבלת קצב או ויסות נתונים.
- לחפש משתמשים לפי קריטריונים שונים, כמו מזהה משתמש, כתובת אימייל או מספר טלפון.
- הצגת רשימה של כל המשתמשים בפרויקט מסוים בקבוצות.
- לגשת למטא-נתונים של המשתמשים, כולל תאריך יצירת החשבון ותאריך הכניסה האחרון.
- למחוק משתמשים בלי להזין את הסיסמה הקיימת שלהם.
- לעדכן את מאפייני המשתמשים, כולל הסיסמה שלהם, בלי להיכנס לחשבון בתור המשתמש.
- לאמת כתובות אימייל בלי לעבור את תהליכי הפעולה מחוץ לתחום לאימות כתובות אימייל.
- לשנות את כתובת האימייל של המשתמש בלי לשלוח קישורים באימייל כדי לבטל את השינויים האלה.
- ליצור משתמש חדש עם מספר טלפון בלי לעבור את תהליך האימות ב-SMS.
- לשנות את מספר הטלפון של המשתמש בלי לעבור את תהליך האימות ב-SMS.
- להקצות משתמשים אופליין במצב מושבת, ואז להחליט מתי להפעיל אותם.
- לבנות מסופי משתמשים מותאמים אישית, שמתאימים למערכת ניהול המשתמשים של אפליקציה ספציפית.
לפני שמתחילים
כדי להשתמש ב-API לניהול משתמשים שכלול ב-SDK של Firebase לאדמינים, צריך חשבון שירות. כדי לקבל מידע נוסף על האופן שבו מפעילים את SDK לאדמינים, אפשר לפעול לפי הוראות ההגדרה.
אחזור נתוני משתמשים
הדרך העיקרית לזהות משתמש היא באמצעות uid, מזהה ייחודי של המשתמש. ב-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(f'Successfully fetched user data: {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(f'Successfully fetched user data: {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}");
השיטה הזו מחזירה אובייקט UserRecord למשתמש שתואם לכתובת האימייל שצוינה.
אם כתובת האימייל שצוינה לא שייכת למשתמש קיים או שלא ניתן לאחזר את המשתמש מכל סיבה אחרת, ה-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(f'Successfully fetched user data: {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 למשתמש שתואם למספר הטלפון שצוין.
אם מספר הטלפון שצוין לא שייך למשתמש קיים או שלא ניתן לאחזר את המשתמש מכל סיבה אחרת, ה-SDK לאדמינים יציג שגיאה. רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
אחזור נתוני משתמשים בכמות גדולה
ה-SDK של Firebase לאדמינים מאפשר גם לאחזר רשימה של משתמשים על סמך המזהים שאתם מספקים. אתם יכולים לזהות משתמשים לפי מזהה המשתמש, כתובת האימייל או מספר הטלפון שלהם. אפשר לספק עד 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}");
}
השיטה הזו מחזירה רשימה באותו גודל כמו רשימת הקלט, כשכל רשומה מכילה את ה-UserRecord התואם או שגיאה שמציינת למה לא ניתן היה לחפש את המזהה הזה. רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
יצירת משתמש
ב-Admin SDK יש שיטה שמאפשרת ליצור משתמש חדש ב-Firebase Authentication. השיטה הזו מקבלת אובייקט שמכיל את פרטי הפרופיל שצריך לכלול בחשבון המשתמש החדש שנוצר:
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(f'Sucessfully created new user: {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 משלכם למשתמש החדש, אתם יכולים לכלול אותו כארגומנט שמועבר ל-method ליצירת משתמש:
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(f'Sucessfully created new user: {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.
עדכון משתמש
ה-SDK של Firebase לאדמינים מאפשר לשנות נתונים של משתמש קיים. צריך לציין 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(f'Sucessfully updated user: {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 |
מחרוזת | null |
מספר הטלפון הראשי החדש של המשתמש. צריך להזין מספר טלפון תקין שתואם למפרט E.164. צריך להגדיר את הערך null כדי למחוק את מספר הטלפון הקיים של המשתמש.
|
password |
מחרוזת | הסיסמה החדשה של המשתמש, לא מגובבת. הסיסמה צריכה להיות באורך של שישה תווים לפחות. |
displayName |
מחרוזת | null |
השם החדש שיוצג למשתמשים. צריך להגדיר את הערך null כדי למחוק את השם המוצג הקיים של המשתמש.
|
photoURL |
מחרוזת | null |
כתובת ה-URL של התמונה החדשה של המשתמשים. צריך להגדיר את הערך null כדי למחוק את כתובת ה-URL הקיימת של תמונת המשתמש. אם הערך הוא לא null, הוא חייב להיות כתובת URL תקינה.
|
disabled |
בוליאני |
אם המשתמש מושבת או לא. true אם מושבת,
false אם מופעל.
|
השיטה לעדכון משתמש מחזירה אובייקט UserRecord מעודכן כשהעדכון מסתיים בהצלחה.
אם הערך של uid לא תואם למשתמש קיים, אם כתובת האימייל או מספר הטלפון שצוינו כבר נמצאים בשימוש של משתמש קיים, או אם אי אפשר לעדכן את המשתמש מכל סיבה אחרת, השיטה שלמעלה תיכשל ותופיע שגיאה. רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
מחיקת משתמש
ה-SDK של Firebase לאדמינים מאפשר למחוק משתמשים קיימים לפי 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.");
השיטה למחיקת משתמש מחזירה תוצאה ריקה כשהמחיקה מסתיימת בהצלחה.
אם הערך של uid לא תואם למשתמש קיים, או שלא ניתן למחוק את המשתמש מכל סיבה אחרת, השיטה למחיקת משתמשים מחזירה שגיאה.
רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
מחיקת כמה משתמשים
באמצעות ה-SDK של Firebase לאדמינים אפשר גם למחוק כמה משתמשים בבת אחת. עם זאת, חשוב לזכור ששימוש בשיטות כמו 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(f'Successfully deleted {result.success_count} users')
print(f'Failed to delete {result.failure_count} users')
for err in result.errors:
print(f'error #{result.index}, reason: {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}");
}
השיטה למחיקת משתמשים מחזירה רשימה של כשלים לגבי המשתמשים שלא ניתן היה למחוק. רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
הצגת רשימה של כל המשתמשים
ה-SDK של Firebase לאדמינים מאפשר לאחזר את כל רשימת המשתמשים בקבוצות:
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.
רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבים לפתרון, מופיעה במאמר שגיאות ב-Admin Authentication API.
ערכי הגיבוב של הסיסמאות של המשתמשים שברשימה
ה-API הזה גם מחזיר את passwordSalt ו-passwordHash שעברו גיבוב (hash) על ידי הקצה העורפי של Firebase Auth למשתמשים עם סיסמה, אם לחשבון המשתמש או לחשבון השירות ששימשו ליצירת אסימון הגישה של OAuth יש את ההרשאה firebaseauth.configs.getHashConfig. אחרת, המאפיינים passwordHash ו-passwordSalt לא יוגדרו.
בגלל הרגישות של גיבובי סיסמאות, לחשבון השירות של ה-SDK של Firebase לאדמינים אין את ההרשאה firebaseauth.configs.getHashConfig כברירת מחדל. אי אפשר להוסיף הרשאה ישירות לחשבון משתמש או לחשבון שירות, אבל אפשר לעשות את זה באופן עקיף על ידי יצירת תפקיד IAM בהתאמה אישית.
כדי ליצור את תפקיד ה-IAM בהתאמה אישית:
- נכנסים לדף Roles בחלונית IAM & admin במסוף Google Cloud.
- בוחרים את הפרויקט מהתפריט הנפתח בחלק העליון של הדף.
- לוחצים על יצירת תפקיד.
- לוחצים על ADD PERMISSIONS.
- מחפשים את ההרשאה
firebaseauth.configs.getHashConfigומסמנים את התיבה שלה. - לוחצים על הוספה.
- לוחצים על CREATE כדי לסיים את יצירת התפקיד החדש.
מוסיפים את התפקיד בהתאמה אישית שיצרתם לחשבון המשתמש או לחשבון השירות בדף IAM:
- בחלונית IAM & admin, לוחצים על IAM.
- בוחרים את חשבון השירות או את חשבון המשתמש מרשימת החברים לעריכה.
- לוחצים על הוספת תפקיד.
- מחפשים את התפקיד החדש בהתאמה אישית שיצרתם.
- לוחצים על שמירה.