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

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

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

جافا

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

في بعض الحالات، سيظهر لك عنوان البريد الإلكتروني للمستخدم بدلاً من uid. Firebase تتيح "حزمة تطوير البرامج (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());

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

إذا لم يكن البريد الإلكتروني المقدَّم تابعًا لمستخدم حالي أو لا يمكن للمستخدم التي تم جلبها لأي سبب آخر، ستعرض حزمة تطوير البرامج (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);
  });

جافا

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

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

جافا

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

إنشاء مستخدم

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

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

تعديل مستخدم

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

Node.js

getAuth()
  .updateUser(uid, {
    email: 'modifiedUser@example.com',
    phoneNumber: '+11234567890',
    emailVerified: true,
    password: 'newPassword',
    displayName: 'Jane Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: true,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully updated user', userRecord.toJSON());
  })
  .catch((error) => {
    console.log('Error updating user:', error);
  });

جافا

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 لمحو عنوان URL الخاص بالمستخدم. الاسم المعروض الحالي.
photoURL سلسلة | null عنوان URL للصورة الجديدة. اضبط القيمة على null لمحو عنوان URL الخاص بالمستخدم. عنوان 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);
  });

جافا

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

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

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

جافا

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

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

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

تسمح حزمة 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، سيتم استخدام القيمة التلقائية التي تبلغ 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. انقر على حفظ.