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

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

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

قبل البدء

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

Python

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)

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

جافا

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

انتقال

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

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

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

جافا

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

انتقال

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

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

جافا

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)

انتقال

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 API الخاصة بالمشرفين.

إنشاء مستخدم

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

جافا

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

انتقال

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

جافا

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

انتقال

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

جافا

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

انتقال

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 للتشغيل

تُرجِع طريقة update user عنصر UserRecord معدَّلاً عند اكتمال التحديث بنجاح.

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

حذف مستخدم

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

Python

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)

#C

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

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

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

جافا

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

انتقال

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

جافا

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

انتقال

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

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

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

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

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

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

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

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

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