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

توفّر حزمة تطوير البرامج (SDK) للمشرف في Firebase واجهة برمجة تطبيقات لإدارة Firebase Authentication المستخدمين الذين لديهم امتيازات أعلى. تتيح لك واجهة برمجة التطبيقات لإدارة المستخدمين المشرفين إمكانية إكمال المهام التالية آليًا من بيئة خادم آمنة:

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

قبل البدء

لاستخدام واجهة برمجة التطبيقات لإدارة المستخدمين التي توفّرها حزمة تطوير البرامج (SDK) للمشرف في Firebase، يجب أن يكون لديك حساب خدمة. اتّبِع تعليمات الإعداد للحصول على مزيد من المعلومات حول كيفية إعداد حزمة Admin 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. تتيح حزمة تطوير البرامج (SDK) للإدارة من Firebase البحث عن معلومات المستخدمين باستخدام عنوان البريد الإلكتروني:

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

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

في حالات أخرى، سيتوفّر لديك رقم هاتف المستخدم بدلاً من 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);
  });

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 للمستخدم المرتبط برقم الهاتف المقدَّم.

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

استرداد بيانات المستخدمين بشكل مجمَّع

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

إنشاء مستخدم

توفّر حزمة تطوير البرامج (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 الخاص بك للمستخدم الجديد، يمكنك تضمينه كوسيط يتم تمريره إلى طريقة إنشاء المستخدم:

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 عشوائي تلقائيًا. تحقّق uids الأقصر أداءً أفضل.
email سلسلة عنوان البريد الإلكتروني الأساسي للمستخدم يجب إدخال عنوان بريد إلكتروني صالح.
emailVerified قيمة منطقية تُستخدَم لتحديد ما إذا تم إثبات ملكية عنوان البريد الإلكتروني الأساسي للمستخدم أم لا. إذا لم يتم توفيرها، تكون القيمة التلقائية false.
phoneNumber سلسلة رقم الهاتف الأساسي للمستخدم يجب أن يكون رقم هاتف صالحًا ومتوافقًا مع مواصفات E.164.
password سلسلة كلمة مرور المستخدم غير المشفرة. يجب أن تتألف من ستة أحرف على الأقل.
displayName سلسلة الاسم المعروض للمستخدمين.
photoURL سلسلة تمثّل هذه السمة عنوان URL الخاص بصورة المستخدم.
disabled قيمة منطقية تحديد ما إذا كان المستخدم غير مفعّل أم لا true لذوي الاحتياجات الخاصة، false للخيارات المفعَّلة. إذا لم يتم توفيرها، تكون القيمة التلقائية false.

تعرض طريقة إنشاء المستخدم كائن UserRecord للمستخدم الذي تم إنشاؤه حديثًا.

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

تعديل مستخدم

تسهّل حزمة تطوير البرامج (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 سلسلة رقم الهاتف الأساسي الجديد للمستخدم يجب أن يكون رقم هاتف صالحًا ومتوافقًا مع مواصفات E.164. اضبط القيمة على null لمحو رقم هاتف المستخدم الحالي.
password سلسلة كلمة المرور الجديدة غير المشفرة للمستخدم يجب أن تتألف من ستة أحرف على الأقل.
displayName سلسلة | null الاسم المعروض الجديد للمستخدمين اضبط القيمة على null لمحو الاسم المعروض الحالي للمستخدم.
photoURL سلسلة | null تمثّل هذه السمة عنوان URL الجديد لصورة المستخدمين. اضبط القيمة على null لمحو عنوان URL الحالي للصورة. إذا كانت القيمة غير null، يجب أن تكون عنوان URL صالحًا.
disabled قيمة منطقية تحديد ما إذا كان المستخدم غير مفعّل أم لا true لذوي الاحتياجات الخاصة، false للخيارات المفعَّلة.

تعرض طريقة تعديل المستخدم كائن UserRecord معدَّلاً عند اكتمال عملية التعديل بنجاح.

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

حذف مستخدم

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

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

يمكن أن تحذف حزمة تطوير البرامج (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}");
}

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

عرض قائمة بجميع المستخدمين

تتيح حزمة تطوير البرامج (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.

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

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

تعرض واجهة برمجة التطبيقات هذه أيضًا قيمة passwordSalt وpasswordHash التي تم تشفيرها باستخدام الخلفية الخاصة بخدمة Firebase Auth للمستخدمين الذين يستخدمون كلمات المرور، وذلك إذا كان حساب المستخدم أو حساب الخدمة المستخدَم لإنشاء رمز مميز للوصول إلى OAuth يتضمّن الإذن firebaseauth.configs.getHashConfig. وإلا لن يتم ضبط passwordHash وpasswordSalt.

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

لإنشاء دور مخصّص في إدارة الهوية وإمكانية الوصول (IAM)، اتّبِع الخطوات التالية:

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

أضِف الدور المخصّص الذي تم إنشاؤه إلى حساب المستخدم أو حساب الخدمة في صفحة "إدارة الهوية وإمكانية الوصول" (IAM):

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