إدارة المستخدمين

توفر Firebase Admin SDK واجهة برمجة تطبيقات لإدارة مستخدمي مصادقة Firebase بامتيازات مرتفعة. تمنحك واجهة برمجة تطبيقات إدارة المستخدم الإدارية القدرة على إكمال المهام التالية برمجيًا من بيئة خادم آمنة:

  • قم بإنشاء مستخدمين جدد دون أي قيود أو تحديد للمعدل.
  • ابحث عن المستخدمين حسب معايير مختلفة مثل uid أو البريد الإلكتروني أو رقم الهاتف.
  • سرد كافة مستخدمي مشروع محدد على دفعات.
  • الوصول إلى البيانات التعريفية للمستخدم بما في ذلك تاريخ إنشاء الحساب وتاريخ آخر تسجيل دخول.
  • حذف المستخدمين دون الحاجة إلى كلمة المرور الحالية الخاصة بهم.
  • قم بتحديث خصائص المستخدم - بما في ذلك كلمة المرور - دون الحاجة إلى تسجيل الدخول باسم المستخدم.
  • التحقق من رسائل البريد الإلكتروني دون الاضطرار إلى متابعة تدفقات الإجراءات خارج النطاق للتحقق من رسائل البريد الإلكتروني.
  • قم بتغيير البريد الإلكتروني للمستخدم دون إرسال روابط البريد الإلكتروني لإلغاء هذه التغييرات.
  • قم بإنشاء مستخدم جديد برقم هاتف دون الحاجة إلى متابعة عملية التحقق عبر الرسائل النصية القصيرة.
  • قم بتغيير رقم هاتف المستخدم دون الحاجة إلى متابعة عملية التحقق عبر الرسائل النصية القصيرة.
  • توفير المستخدمين دون اتصال بالإنترنت في حالة تعطيل ثم التحكم لاحقًا في وقت تمكينهم.
  • قم ببناء وحدات تحكم مستخدم مخصصة مصممة خصيصًا لنظام إدارة مستخدم تطبيق معين.

قبل ان تبدأ

لاستخدام واجهة برمجة تطبيقات إدارة المستخدم المقدمة من 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);
  });

جافا

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());

بايثون

from firebase_admin import auth

user = auth.get_user(uid)
print('Successfully fetched user data: {0}'.format(user.uid))

يذهب

// 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)

ج#

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);
  });

جافا

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());

بايثون

from firebase_admin import auth

user = auth.get_user_by_email(email)
print('Successfully fetched user data: {0}'.format(user.uid))

يذهب

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)

ج#

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 للمستخدم المطابق للبريد الإلكتروني المقدم.

إذا كان البريد الإلكتروني المقدم لا ينتمي إلى مستخدم حالي أو لا يمكن جلب المستخدم لأي سبب آخر، فسوف تعرض Admin SDK خطأً. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

وفي حالات أخرى، سيكون لديك رقم هاتف المستخدم بدلاً من uid الخاص به. تدعم Firebase Admin SDK البحث عن معلومات المستخدم باستخدام رقم الهاتف:

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);
  });

جافا

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());

بايثون

from firebase_admin import auth

user = auth.get_user_by_phone_number(phone)
print('Successfully fetched user data: {0}'.format(user.uid))

يذهب

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)

ج#

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 للمشرف خطأً. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

استرداد بيانات المستخدم بكميات كبيرة

يسمح Firebase Admin SDK أيضًا باسترداد قائمة المستخدمين بناءً على المعرفات التي تقدمها. يمكنك التعرف على المستخدمين من خلال معرف المستخدم أو البريد الإلكتروني أو رقم الهاتف. يمكن توفير 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);
  });

جافا

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);
}

بايثون

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)

يذهب

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)
}

ج#

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 SDK طريقة تسمح لك بإنشاء مستخدم جديد لمصادقة Firebase. تقبل هذه الطريقة كائنًا يحتوي على معلومات الملف الشخصي لتضمينها في حساب المستخدم المنشأ حديثًا:

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);
  });

جافا

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());

بايثون

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))

يذهب

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)

ج#

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 بإنشاء 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);
  });

جافا

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());

بايثون

user = auth.create_user(
    uid='some-uid', email='user@example.com', phone_number='+15555550100')
print('Sucessfully created new user: {0}'.format(user.uid))

يذهب

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)

ج#

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 أو البريد الإلكتروني أو رقم الهاتف المقدم قيد الاستخدام بالفعل من قبل مستخدم حالي أو لا يمكن إنشاء المستخدم لأي سبب آخر، فستفشل الطريقة المذكورة أعلاه مع حدوث خطأ. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

تحديث مستخدم

تسهل 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);
  });

جافا

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());

بايثون

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))

يذهب

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)

ج#

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 للتمكين.

يقوم أسلوب مستخدم التحديث بإرجاع كائن UserRecord محدث عند اكتمال التحديث بنجاح.

إذا كان المعرف الفريد uid المقدم لا يتوافق مع مستخدم حالي، أو كان البريد الإلكتروني أو رقم الهاتف المقدم قيد الاستخدام بالفعل من قبل مستخدم حالي، أو لا يمكن تحديث المستخدم لأي سبب آخر، فستفشل الطريقة المذكورة أعلاه مع حدوث خطأ. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

حذف مستخدم

يسمح Firebase Admin SDK بحذف المستخدمين الحاليين بواسطة uid الخاص بهم:

Node.js

getAuth()
  .deleteUser(uid)
  .then(() => {
    console.log('Successfully deleted user');
  })
  .catch((error) => {
    console.log('Error deleting user:', error);
  });

جافا

FirebaseAuth.getInstance().deleteUser(uid);
System.out.println("Successfully deleted user.");

بايثون

auth.delete_user(uid)
print('Successfully deleted user')

يذهب

err := client.DeleteUser(ctx, uid)
if err != nil {
	log.Fatalf("error deleting user: %v\n", err)
}
log.Printf("Successfully deleted user: %s\n", uid)

ج#

await FirebaseAuth.DefaultInstance.DeleteUserAsync(uid);
Console.WriteLine("Successfully deleted user.");

تقوم طريقة حذف المستخدم بإرجاع نتيجة فارغة عند اكتمال الحذف بنجاح.

إذا كان المعرف الفريد uid المقدم لا يتوافق مع مستخدم موجود أو لا يمكن حذف المستخدم لأي سبب آخر، فستؤدي طريقة حذف المستخدم إلى ظهور خطأ. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

حذف عدة مستخدمين

يمكن لـ Firebase Admin SDK أيضًا حذف عدة مستخدمين في وقت واحد. ومع ذلك، لاحظ أن استخدام أساليب مثل 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);
  });

جافا

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());
}

بايثون

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))

يذهب

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)
}

ج#

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}");
}

تقوم طريقة حذف المستخدمين بإرجاع قائمة بالفشل للمستخدمين الذين تعذر حذفهم. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

قائمة كافة المستخدمين

تسمح 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();

جافا

// 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());
}

بايثون

# 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)

يذهب

// 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
	}
}

ج#

// 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 ، فسيتم استخدام 1000 مستخدم افتراضي لكل دفعة. وهذا أيضًا هو الحد الأقصى لعدد المستخدمين المسموح بإدراجهم في المرة الواحدة. أي قيمة أكبر من الحد الأقصى سوف تؤدي إلى خطأ في الوسيطة. إذا لم يتم تحديد pageToken ، فستقوم العملية بإدراج المستخدمين من البداية، مرتبة حسب uid .

للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، راجع أخطاء واجهة برمجة تطبيقات مصادقة المسؤول .

تجزئات كلمة المرور للمستخدمين المدرجين

تُرجع واجهة برمجة التطبيقات (API) هذه أيضًا كلمة passwordSalt و passwordHash بواسطة الواجهة الخلفية لـ Firebase Auth لمستخدمي كلمة المرور إذا كان حساب المستخدم/الخدمة المستخدم لإنشاء رمز وصول OAuth للطلب لديه إذن firebaseauth.configs.getHashConfig . وإلا فلن يتم تعيين passwordHash و passwordSalt .

نظرًا للطبيعة الحساسة لتجزئة كلمة المرور، لا يتمتع حساب خدمة Firebase Admin SDK بالإذن firebaseauth.configs.getHashConfig افتراضيًا. لا يمكنك إضافة إذن مباشرةً إلى حساب مستخدم/خدمة، ولكن يمكنك القيام بذلك بشكل غير مباشر عن طريق إنشاء دور IAM مخصص .

لإنشاء دور IAM المخصص:

  1. انتقل إلى صفحة الأدوار في IAM ولوحة الإدارة في وحدة تحكم Google Cloud.
  2. حدد مشروعك من القائمة المنسدلة في أعلى الصفحة.
  3. انقر فوق إنشاء دور
  4. انقر فوق إضافة أذونات
  5. ابحث عن إذن firebaseauth.configs.getHashConfig وحدد مربع الاختيار هذا.
  6. انقر فوق إضافة
  7. انقر فوق "إنشاء" لإنهاء إنشاء الدور الجديد.

أضف الدور المخصص الذي تم إنشاؤه إلى حساب المستخدم/الخدمة في صفحة IAM:

  1. في لوحة IAM والمسؤول ، حدد IAM
  2. حدد الخدمة أو حساب المستخدم من قائمة الأعضاء للتحرير.
  3. انقر فوق إضافة دور آخر .
  4. ابحث عن الدور المخصص الجديد الذي تم إنشاؤه مسبقًا.
  5. انقر فوق حفظ .