Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

사용자 관리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase Admin SDK는 높은 권한으로 Firebase 인증 사용자를 관리하기 위한 API를 제공합니다. 관리 사용자 관리 API는 보안 서버 환경에서 프로그래밍 방식으로 다음 작업을 완료할 수 있는 기능을 제공합니다.

  • 스로틀링이나 속도 제한 없이 새 사용자를 만듭니다.
  • uid, 이메일 또는 전화번호와 같은 다양한 기준으로 사용자를 조회합니다.
  • 지정된 프로젝트의 모든 사용자를 일괄적으로 나열합니다.
  • 계정 생성 날짜 및 마지막 로그인 날짜를 포함한 사용자 메타데이터에 액세스합니다.
  • 기존 암호를 요구하지 않고 사용자를 삭제합니다.
  • 사용자로 로그인할 필요 없이 사용자 속성(암호 포함)을 업데이트합니다.
  • 이메일 확인을 위해 대역 외 작업 흐름을 거치지 않고 이메일을 확인합니다.
  • 이러한 변경 사항을 취소하려면 이메일 링크를 보내지 않고 사용자의 이메일을 변경하십시오.
  • SMS 확인 절차를 거치지 않고 전화번호로 새 사용자를 만듭니다.
  • SMS 확인 절차를 거치지 않고 사용자의 전화번호를 변경합니다.
  • 오프라인에서는 비활성화된 상태의 사용자를 프로비저닝한 다음 나중에 활성화할 시기를 제어합니다.
  • 특정 애플리케이션의 사용자 관리 시스템에 맞는 맞춤형 사용자 콘솔을 구축합니다.

시작하기 전에

Firebase Admin SDK에서 제공하는 사용자 관리 API를 사용하려면 서비스 계정이 있어야 합니다. Admin SDK 초기화 방법에 대한 자세한 내용은 설정 지침 을 따르십시오.

사용자 데이터 검색

사용자를 식별하는 기본 방법은 해당 사용자의 고유 식별자인 uid 를 사용하는 것입니다. Admin SDK는 uid 로 사용자의 프로필 정보를 가져올 수 있는 방법을 제공합니다.

Node.js

getAuth()
  .getUser(uid)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

자바

UserRecord userRecord = FirebaseAuth.getInstance().getUser(uid);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getUid());

파이썬

from firebase_admin import auth

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

가다

// Get an auth client from the firebase.App
client, err := app.Auth(ctx)
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

u, err := client.GetUser(ctx, uid)
if err != nil {
	log.Fatalf("error getting user %s: %v\n", uid, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

씨#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserAsync(uid);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

이 메서드는 메서드에 제공된 uid 에 해당하는 사용자의 UserRecord 개체를 반환합니다.

제공된 uid 가 기존 사용자에 속하지 않거나 다른 이유로 사용자를 가져올 수 없는 경우 위의 메서드에서 오류가 발생합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 Admin Auth API 오류 를 참조하십시오.

어떤 경우에는 uid 대신 사용자의 이메일을 갖게 됩니다. Firebase Admin SDK는 이메일로 사용자 정보 조회를 지원합니다.

Node.js

getAuth()
  .getUserByEmail(email)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data: ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

자바

UserRecord userRecord = FirebaseAuth.getInstance().getUserByEmail(email);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getEmail());

파이썬

from firebase_admin import auth

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

가다

u, err := client.GetUserByEmail(ctx, email)
if err != nil {
	log.Fatalf("error getting user by email %s: %v\n", email, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

씨#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

이 메소드는 제공된 이메일에 해당하는 사용자의 UserRecord 객체를 반환합니다.

제공된 이메일이 기존 사용자의 것이 아니거나 다른 이유로 사용자를 가져올 수 없는 경우 Admin SDK에서 오류가 발생합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

다른 경우에는 uid 대신 사용자의 전화번호를 갖게 됩니다. Firebase Admin SDK는 전화번호로 사용자 정보 조회를 지원합니다.

Node.js

getAuth()
  .getUserByPhoneNumber(phoneNumber)
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log(`Successfully fetched user data:  ${userRecord.toJSON()}`);
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

자바

UserRecord userRecord = FirebaseAuth.getInstance().getUserByPhoneNumber(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
System.out.println("Successfully fetched user data: " + userRecord.getPhoneNumber());

파이썬

from firebase_admin import auth

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

가다

u, err := client.GetUserByPhoneNumber(ctx, phone)
if err != nil {
	log.Fatalf("error getting user by phone %s: %v\n", phone, err)
}
log.Printf("Successfully fetched user data: %v\n", u)

씨#

UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully fetched user data: {userRecord.Uid}");

이 메소드는 제공된 전화번호에 해당하는 사용자의 UserRecord 객체를 반환합니다.

제공된 전화번호가 기존 사용자의 것이 아니거나 다른 이유로 사용자를 가져올 수 없는 경우 Admin SDK에서 오류가 발생합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

대량 검색 사용자 데이터

Firebase Admin SDK를 사용하면 제공한 식별자를 기반으로 사용자 목록을 검색할 수도 있습니다. 사용자 ID, 이메일 또는 전화번호로 사용자를 식별할 수 있습니다. 단일 호출에서 최대 100개의 식별자를 제공할 수 있습니다. 식별자에는 다음 유형이 혼합되어 포함될 수 있습니다.

Node.js

getAuth()
  .getUsers([
    { uid: 'uid1' },
    { email: 'user2@example.com' },
    { phoneNumber: '+15555550003' },
    { providerId: 'google.com', providerUid: 'google_uid4' },
  ])
  .then((getUsersResult) => {
    console.log('Successfully fetched user data:');
    getUsersResult.users.forEach((userRecord) => {
      console.log(userRecord);
    });

    console.log('Unable to find users corresponding to these identifiers:');
    getUsersResult.notFound.forEach((userIdentifier) => {
      console.log(userIdentifier);
    });
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

자바

GetUsersResult result = FirebaseAuth.getInstance().getUsersAsync(Arrays.asList(
    new UidIdentifier("uid1"),
    new EmailIdentifier("user2@example.com"),
    new PhoneIdentifier("+15555550003"),
    new ProviderIdentifier("google.com", "google_uid4"))).get();

System.out.println("Successfully fetched user data:");
for (UserRecord user : result.getUsers()) {
  System.out.println(user.getUid());
}

System.out.println("Unable to find users corresponding to these identifiers:");
for (UserIdentifier uid : result.getNotFound()) {
  System.out.println(uid);
}

파이썬

from firebase_admin import auth

result = auth.get_users([
    auth.UidIdentifier('uid1'),
    auth.EmailIdentifier('user2@example.com'),
    auth.PhoneIdentifier(+15555550003),
    auth.ProviderIdentifier('google.com', 'google_uid4')
])

print('Successfully fetched user data:')
for user in result.users:
    print(user.uid)

print('Unable to find users corresponding to these identifiers:')
for uid in result.not_found:
    print(uid)

가다

getUsersResult, err := client.GetUsers(ctx, []auth.UserIdentifier{
	auth.UIDIdentifier{UID: "uid1"},
	auth.EmailIdentifier{Email: "user@example.com"},
	auth.PhoneIdentifier{PhoneNumber: "+15555551234"},
	auth.ProviderIdentifier{ProviderID: "google.com", ProviderUID: "google_uid1"},
})
if err != nil {
	log.Fatalf("error retriving multiple users: %v\n", err)
}

log.Printf("Successfully fetched user data:")
for _, u := range getUsersResult.Users {
	log.Printf("%v", u)
}

log.Printf("Unable to find users corresponding to these identifiers:")
for _, id := range getUsersResult.NotFound {
	log.Printf("%v", id)
}

씨#

GetUsersResult result = await FirebaseAuth.DefaultInstance.GetUsersAsync(
    new List<UserIdentifier>
    {
        new UidIdentifier("uid1"),
        new EmailIdentifier("user2@example.com"),
        new PhoneIdentifier("+15555550003"),
        new ProviderIdentifier("google.com", "google_uid4"),
    });

Console.WriteLine("Successfully fetched user data:");
foreach (UserRecord user in result.Users)
{
    Console.WriteLine($"User: {user.Uid}");
}

Console.WriteLine("Unable to find users corresponding to these identifiers:");
foreach (UserIdentifier uid in result.NotFound)
{
    Console.WriteLine($"{uid}");
}

이 메서드는 입력 목록과 동일한 크기의 목록을 반환하며 각 항목에는 해당 UserRecord 또는 해당 식별자를 조회할 수 없는 이유를 나타내는 오류가 포함됩니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

사용자 만들기

Admin SDK는 새 Firebase 인증 사용자를 생성할 수 있는 방법을 제공합니다. 이 메서드는 새로 만든 사용자 계정에 포함할 프로필 정보가 포함된 개체를 허용합니다.

Node.js

getAuth()
  .createUser({
    email: 'user@example.com',
    emailVerified: false,
    phoneNumber: '+11234567890',
    password: 'secretPassword',
    displayName: 'John Doe',
    photoURL: 'http://www.example.com/12345678/photo.png',
    disabled: false,
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

자바

CreateRequest request = new CreateRequest()
    .setEmail("user@example.com")
    .setEmailVerified(false)
    .setPassword("secretPassword")
    .setPhoneNumber("+11234567890")
    .setDisplayName("John Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(false);

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

파이썬

user = auth.create_user(
    email='user@example.com',
    email_verified=False,
    phone_number='+15555550100',
    password='secretPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=False)
print('Sucessfully created new user: {0}'.format(user.uid))

가다

params := (&auth.UserToCreate{}).
	Email("user@example.com").
	EmailVerified(false).
	PhoneNumber("+15555550100").
	Password("secretPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(false)
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

씨#

UserRecordArgs args = new UserRecordArgs()
{
    Email = "user@example.com",
    EmailVerified = false,
    PhoneNumber = "+11234567890",
    Password = "secretPassword",
    DisplayName = "John Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = false,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

기본적으로 Firebase 인증은 새 사용자에 대해 임의의 uid 를 생성합니다. 대신 새 사용자에 대한 고유한 uid 를 지정하려는 경우 사용자 생성 메서드에 전달되는 인수로 포함할 수 있습니다.

Node.js

getAuth()
  .createUser({
    uid: 'some-uid',
    email: 'user@example.com',
    phoneNumber: '+11234567890',
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });

자바

CreateRequest request = new CreateRequest()
    .setUid("some-uid")
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890");

UserRecord userRecord = FirebaseAuth.getInstance().createUser(request);
System.out.println("Successfully created new user: " + userRecord.getUid());

파이썬

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

가다

params := (&auth.UserToCreate{}).
	UID(uid).
	Email("user@example.com").
	PhoneNumber("+15555550100")
u, err := client.CreateUser(ctx, params)
if err != nil {
	log.Fatalf("error creating user: %v\n", err)
}
log.Printf("Successfully created user: %v\n", u)

씨#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = "some-uid",
    Email = "user@example.com",
    PhoneNumber = "+11234567890",
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.CreateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully created new user: {userRecord.Uid}");

다음 속성의 모든 조합을 제공할 수 있습니다.

표 1. 사용자 생성 작업에서 지원하는 속성

속성 유형 설명
uid 새로 생성된 사용자에게 할당할 uid 입니다. 길이가 1-128자 사이의 문자열이어야 합니다. 제공하지 않으면 임의의 uid 가 자동으로 생성됩니다. 짧은 uid 는 더 나은 성능을 제공합니다.
email 사용자의 기본 이메일입니다. 유효한 이메일 주소이어야합니다.
emailVerified 부울 사용자의 기본 이메일이 확인되었는지 여부입니다. 제공되지 않은 경우 기본값은 false 입니다.
phoneNumber 사용자의 기본 전화번호입니다. E.164 사양을 준수하는 유효한 전화번호여야 합니다.
password 사용자의 해싱되지 않은 원시 비밀번호입니다. 6자 이상이어야 합니다.
displayName 사용자의 표시 이름입니다.
photoURL 사용자의 사진 URL입니다.
disabled 부울 사용자가 비활성화되었는지 여부입니다. 장애인의 true ; 활성화된 경우 false 입니다. 제공되지 않은 경우 기본값은 false 입니다.

사용자 생성 메소드는 새로 생성된 사용자에 대한 UserRecord 객체를 반환합니다.

제공된 uid , 이메일 또는 전화번호가 기존 사용자에 의해 이미 사용 중이거나 다른 이유로 사용자를 생성할 수 없는 경우 위 방법은 오류와 함께 실패합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

사용자 업데이트

Firebase Admin SDK는 기존 사용자의 데이터 수정을 용이하게 합니다. 해당 사용자에 대해 업데이트할 속성과 함께 uid 를 지정해야 합니다.

Node.js

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

자바

UpdateRequest request = new UpdateRequest(uid)
    .setEmail("user@example.com")
    .setPhoneNumber("+11234567890")
    .setEmailVerified(true)
    .setPassword("newPassword")
    .setDisplayName("Jane Doe")
    .setPhotoUrl("http://www.example.com/12345678/photo.png")
    .setDisabled(true);

UserRecord userRecord = FirebaseAuth.getInstance().updateUser(request);
System.out.println("Successfully updated user: " + userRecord.getUid());

파이썬

user = auth.update_user(
    uid,
    email='user@example.com',
    phone_number='+15555550100',
    email_verified=True,
    password='newPassword',
    display_name='John Doe',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=True)
print('Sucessfully updated user: {0}'.format(user.uid))

가다

params := (&auth.UserToUpdate{}).
	Email("user@example.com").
	EmailVerified(true).
	PhoneNumber("+15555550100").
	Password("newPassword").
	DisplayName("John Doe").
	PhotoURL("http://www.example.com/12345678/photo.png").
	Disabled(true)
u, err := client.UpdateUser(ctx, uid, params)
if err != nil {
	log.Fatalf("error updating user: %v\n", err)
}
log.Printf("Successfully updated user: %v\n", u)

씨#

UserRecordArgs args = new UserRecordArgs()
{
    Uid = uid,
    Email = "modifiedUser@example.com",
    PhoneNumber = "+11234567890",
    EmailVerified = true,
    Password = "newPassword",
    DisplayName = "Jane Doe",
    PhotoUrl = "http://www.example.com/12345678/photo.png",
    Disabled = true,
};
UserRecord userRecord = await FirebaseAuth.DefaultInstance.UpdateUserAsync(args);
// See the UserRecord reference doc for the contents of userRecord.
Console.WriteLine($"Successfully updated user: {userRecord.Uid}");

다음 속성의 모든 조합을 제공할 수 있습니다.

표 2. 사용자 업데이트 작업에서 지원하는 속성

속성 유형 설명
email 사용자의 새 기본 이메일입니다. 유효한 이메일 주소이어야합니다.
emailVerified 부울 사용자의 기본 이메일이 확인되었는지 여부입니다. 제공되지 않은 경우 기본값은 false 입니다.
phoneNumber 사용자의 새 기본 전화번호입니다. E.164 사양을 준수하는 유효한 전화번호여야 합니다. 사용자의 기존 전화번호를 지우려면 null 로 설정하십시오.
password 사용자의 해시되지 않은 새 원시 비밀번호입니다. 6자 이상이어야 합니다.
displayName 문자열 | null 사용자의 새 표시 이름입니다. 사용자의 기존 표시 이름을 지우려면 null 로 설정하십시오.
photoURL 문자열 | null 사용자의 새 사진 URL입니다. 사용자의 기존 사진 URL을 지우려면 null 로 설정하십시오. null 이 아닌 경우 유효한 URL이어야 합니다.
disabled 부울 사용자가 비활성화되었는지 여부입니다. 장애인의 true ; 활성화된 경우 false 입니다.

update user 메서드는 업데이트가 성공적으로 완료되면 업데이트된 UserRecord 객체를 반환합니다.

제공된 uid 가 기존 사용자와 일치하지 않거나 제공된 이메일 또는 전화번호가 기존 사용자가 이미 사용 중이거나 다른 이유로 사용자를 업데이트할 수 없는 경우 위 방법은 오류와 함께 실패합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

사용자 삭제

Firebase Admin SDK를 사용하면 uid 로 기존 사용자를 삭제할 수 있습니다.

Node.js

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

자바

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

파이썬

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

가다

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

씨#

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

사용자 삭제 방법은 삭제가 성공적으로 완료되면 빈 결과를 반환합니다.

제공된 uid 가 기존 사용자와 일치하지 않거나 다른 이유로 사용자를 삭제할 수 없는 경우 사용자 삭제 메서드에서 오류가 발생합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

여러 사용자 삭제

Firebase Admin SDK는 한 번에 여러 사용자를 삭제할 수도 있습니다. 그러나 deleteUsers(uids) 와 같은 메서드를 사용하여 한 번에 여러 사용자를 삭제하면 Firebase용 Cloud Functions에 대한 onDelete() 이벤트 핸들러가 트리거되지 않습니다. 이는 일괄 삭제가 각 사용자에 대해 사용자 삭제 이벤트를 트리거하지 않기 때문입니다. 삭제된 각 사용자에 대해 사용자 삭제 이벤트를 실행하려면 한 번에 하나씩 사용자를 삭제하십시오.

Node.js

getAuth()
  .deleteUsers([uid1, uid2, uid3])
  .then((deleteUsersResult) => {
    console.log(`Successfully deleted ${deleteUsersResult.successCount} users`);
    console.log(`Failed to delete ${deleteUsersResult.failureCount} users`);
    deleteUsersResult.errors.forEach((err) => {
      console.log(err.error.toJSON());
    });
  })
  .catch((error) => {
    console.log('Error deleting users:', error);
  });

자바

DeleteUsersResult result = FirebaseAuth.getInstance().deleteUsersAsync(
    Arrays.asList("uid1", "uid2", "uid3")).get();

System.out.println("Successfully deleted " + result.getSuccessCount() + " users");
System.out.println("Failed to delete " + result.getFailureCount() + " users");
for (ErrorInfo error : result.getErrors()) {
  System.out.println("error #" + error.getIndex() + ", reason: " + error.getReason());
}

파이썬

from firebase_admin import auth

result = auth.delete_users(["uid1", "uid2", "uid3"])

print('Successfully deleted {0} users'.format(result.success_count))
print('Failed to delete {0} users'.format(result.failure_count))
for err in result.errors:
    print('error #{0}, reason: {1}'.format(result.index, result.reason))

가다

deleteUsersResult, err := client.DeleteUsers(ctx, []string{"uid1", "uid2", "uid3"})
if err != nil {
	log.Fatalf("error deleting users: %v\n", err)
}

log.Printf("Successfully deleted %d users", deleteUsersResult.SuccessCount)
log.Printf("Failed to delete %d users", deleteUsersResult.FailureCount)
for _, err := range deleteUsersResult.Errors {
	log.Printf("%v", err)
}

씨#

DeleteUsersResult result = await FirebaseAuth.DefaultInstance.DeleteUsersAsync(new List<string>
    {
        "uid1",
        "uid2",
        "uid3",
    });

Console.WriteLine($"Successfully deleted {result.SuccessCount} users.");
Console.WriteLine($"Failed to delete {result.FailureCount} users.");

foreach (ErrorInfo err in result.Errors)
{
    Console.WriteLine($"Error #{err.Index}, reason: {err.Reason}");
}

사용자 삭제 방법은 삭제할 수 없는 사용자에 대한 실패 목록을 반환합니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

모든 사용자 나열

Firebase Admin SDK를 사용하면 전체 사용자 목록을 일괄적으로 검색할 수 있습니다.

Node.js

const listAllUsers = (nextPageToken) => {
  // List batch of users, 1000 at a time.
  getAuth()
    .listUsers(1000, nextPageToken)
    .then((listUsersResult) => {
      listUsersResult.users.forEach((userRecord) => {
        console.log('user', userRecord.toJSON());
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch((error) => {
      console.log('Error listing users:', error);
    });
};
// Start listing users from the beginning, 1000 at a time.
listAllUsers();

자바

// Start listing users from the beginning, 1000 at a time.
ListUsersPage page = FirebaseAuth.getInstance().listUsers(null);
while (page != null) {
  for (ExportedUserRecord user : page.getValues()) {
    System.out.println("User: " + user.getUid());
  }
  page = page.getNextPage();
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
page = FirebaseAuth.getInstance().listUsers(null);
for (ExportedUserRecord user : page.iterateAll()) {
  System.out.println("User: " + user.getUid());
}

파이썬

# Start listing users from the beginning, 1000 at a time.
page = auth.list_users()
while page:
    for user in page.users:
        print('User: ' + user.uid)
    # Get next batch of users.
    page = page.get_next_page()

# Iterate through all users. This will still retrieve users in batches,
# buffering no more than 1000 users in memory at a time.
for user in auth.list_users().iterate_all():
    print('User: ' + user.uid)

가다

// Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API
iter := client.Users(ctx, "")
for {
	user, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		log.Fatalf("error listing users: %s\n", err)
	}
	log.Printf("read user user: %v\n", user)
}

// Iterating by pages 100 users at a time.
// Note that using both the Next() function on an iterator and the NextPage()
// on a Pager wrapping that same iterator will result in an error.
pager := iterator.NewPager(client.Users(ctx, ""), 100, "")
for {
	var users []*auth.ExportedUserRecord
	nextPageToken, err := pager.NextPage(&users)
	if err != nil {
		log.Fatalf("paging error %v\n", err)
	}
	for _, u := range users {
		log.Printf("read user user: %v\n", u)
	}
	if nextPageToken == "" {
		break
	}
}

씨#

// Start listing users from the beginning, 1000 at a time.
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (await responses.MoveNextAsync())
{
    ExportedUserRecords response = responses.Current;
    foreach (ExportedUserRecord user in response.Users)
    {
        Console.WriteLine($"User: {user.Uid}");
    }
}

// Iterate through all users. This will still retrieve users in batches,
// buffering no more than 1000 users in memory at a time.
var enumerator = FirebaseAuth.DefaultInstance.ListUsersAsync(null).GetAsyncEnumerator();
while (await enumerator.MoveNextAsync())
{
    ExportedUserRecord user = enumerator.Current;
    Console.WriteLine($"User: {user.Uid}");
}

결과의 각 배치에는 사용자 목록과 다음 사용자 배치를 나열하는 데 사용되는 다음 페이지 토큰이 포함됩니다. 모든 사용자가 이미 나열되면 pageToken 이 반환되지 않습니다.

maxResults 필드가 지정되지 않은 경우 배치당 기본 사용자 1000명이 사용됩니다. 이는 한 번에 나열할 수 있는 최대 사용자 수이기도 합니다. 최대값보다 큰 값은 인수 오류를 발생시킵니다. pageToken 이 지정되지 않은 경우 작업은 처음부터 uid 순서로 사용자를 나열합니다.

설명 및 해결 단계를 포함한 전체 오류 코드 목록은 관리자 인증 API 오류 를 참조하십시오.

나열된 사용자의 암호 해시

이 API는 요청 OAuth 액세스 토큰을 생성하는 데 사용된 사용자/서비스 계정에 firebaseauth.configs.getHashConfig 권한이 있는 경우 비밀번호 사용자에 대해 Firebase 인증 백엔드에서 해시한 passwordSaltpasswordHash 도 반환합니다. 그렇지 않으면 passwordHashpasswordSalt 가 설정되지 않습니다.

비밀번호 해시의 민감한 특성으로 인해 Firebase Admin SDK 서비스 계정에는 기본적으로 firebaseauth.configs.getHashConfig 권한이 없습니다. 사용자/서비스 계정에 권한을 직접 추가할 수는 없지만 사용자 지정 IAM 역할을 생성하여 간접적으로 추가할 수 있습니다.

사용자 지정 IAM 역할을 생성하려면:

  1. Google Cloud Console에서 IAM 및 관리자 패널의 역할 페이지로 이동합니다.
  2. 페이지 상단의 드롭다운에서 프로젝트를 선택합니다.
  3. 역할 만들기를 클릭합니다.
  4. 권한 추가를 클릭합니다.
  5. firebaseauth.configs.getHashConfig 권한을 검색하고 해당 체크박스를 선택합니다.
  6. 추가를 클릭합니다.
  7. 만들기를 클릭하여 새 역할 만들기 를 완료합니다.

IAM 페이지의 사용자/서비스 계정에 생성된 커스텀 역할을 추가합니다.

  1. IAM 및 관리자 패널에서 IAM 을 선택합니다.
  2. 편집할 구성원 목록에서 서비스 또는 사용자 계정을 선택합니다.
  3. 다른 역할 추가 를 클릭합니다.
  4. 이전에 만든 새 사용자 지정 역할을 검색합니다.
  5. 저장 을 클릭합니다.