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

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

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

قبل البدء

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

في بعض الحالات، سيظهر لك عنوان البريد الإلكتروني للمستخدم بدلاً من 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('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}");

تُرجع هذه الطريقة كائن UserRecord للمستخدم المقابل للبريد الإلكتروني المقدم.

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

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

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

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

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

إنشاء مستخدم

توفر حزمة 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);
  });

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 تلقائيًا 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. الخصائص التي تتيحها عملية إنشاء المستخدم

الموقع Type الوصف
uid سلسلة تمثّل هذه السمة uid التي سيتم تخصيصها للمستخدم الذي تم إنشاؤه حديثًا. ويجب أن يكون سلسلة يتراوح طولها بين 1 و128 حرفًا، بشكل شامل. وإذا لم يتم تقديمه، سيتم إنشاء uid عشوائي تلقائيًا. وتحقّق نطاقات uid الأقصر أداءً أفضل.
email سلسلة عنوان البريد الإلكتروني الأساسي للمستخدم يجب إدخال عنوان بريد إلكتروني صالح.
emailVerified منطقية ما إذا كان قد تم إثبات ملكية البريد الإلكتروني الأساسي للمستخدم أم لا وإذا لم يتم توفيرها، تكون القيمة التلقائية هي false.
phoneNumber سلسلة رقم الهاتف الأساسي للمستخدم يجب أن يكون رقم هاتف صالحًا ومتوافقًا مع مواصفات E.164.
password سلسلة كلمة مرور المستخدم الأولية وغير المجزأة يجب ألا يقل طوله عن ستة أحرف.
displayName سلسلة الاسم المعروض للمستخدمين
photoURL سلسلة عنوان URL لصورة المستخدم.
disabled منطقية ما إذا كان المستخدم قد تم إيقافه أم لا. true للإيقاف، وfalse للتفعيل. وإذا لم يتم توفيرها، تكون القيمة التلقائية هي false.

تعرض طريقة إنشاء حساب المستخدم كائن UserRecord للمستخدم الجديد.

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

تعديل مستخدم

تُسهِّل حزمة تطوير البرامج (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('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. الخصائص المتوافقة مع عملية تحديث المستخدم

الموقع Type الوصف
email سلسلة البريد الإلكتروني الأساسي الجديد للمستخدم يجب إدخال عنوان بريد إلكتروني صالح.
emailVerified منطقية ما إذا كان قد تم إثبات ملكية البريد الإلكتروني الأساسي للمستخدم أم لا وإذا لم يتم توفيرها، تكون القيمة التلقائية هي false.
phoneNumber سلسلة رقم الهاتف الأساسي الجديد للمستخدم يجب أن يكون رقم هاتف صالحًا ومتوافقًا مع مواصفات E.164. اضبط القيمة على null لمحو رقم الهاتف الحالي للمستخدم.
password سلسلة كلمة مرور المستخدم الجديدة الأولية وغير المجزأة يجب ألا يقل طوله عن ستة أحرف.
displayName سلسلة | null الاسم المعروض الجديد للمستخدمين. اضبط القيمة على null لمحو الاسم المعروض الحالي للمستخدم.
photoURL سلسلة | null عنوان URL للصورة الجديدة للمستخدمين. اضبط القيمة على null لمحو عنوان URL الحالي الخاص بالصورة للمستخدم. وإذا لم تكن قيمة السمة null، يجب أن يكون عنوان URL صالحًا.
disabled منطقية ما إذا كان المستخدم قد تم إيقافه أم لا. true للإيقاف، وfalse للتفعيل.

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

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

حذف مستخدم

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

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

ويمكن أن تحذف حزمة تطوير البرامج (SDK) لمشرف Firebase أيضًا عدة مستخدمين في آنٍ واحد. مع ذلك، يُرجى العلم أنّ استخدام طرق مثل deleteUsers(uids) لحذف عدة مستخدمين في وقت واحد لن يؤدي إلى تشغيل معالِجات أحداث onDelete() للوظائف السحابية في 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}");
}

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

إدراج جميع المستخدمين

تسمح حزمة 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.

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

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

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

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

لإنشاء دور مخصَّص لإدارة الهوية وإمكانية الوصول:

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

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

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