콘솔로 이동

사용자 관리

Firebase Admin SDK에서 제공하는 API를 활용하면 더 많은 권한으로 Firebase 인증 사용자를 관리할 수 있습니다. 관리자 사용자 관리 API를 사용하면 안전한 서버 환경에서 프로그래밍 방식으로 다음과 같은 작업을 완료할 수 있습니다.

  • 제한 또는 속도 제한 없이 새 사용자 생성
  • uid, 이메일, 전화번호 등 여러 기준으로 사용자 조회
  • 지정된 프로젝트에 속한 모든 사용자를 배치별로 나열
  • 계정 생성 날짜 및 마지막으로 로그인한 날짜 등 사용자 메타데이터 액세스
  • 기존 사용자 비밀번호를 입력하지 않고 사용자 삭제
  • 사용자로 로그인하지 않고 비밀번호 등 사용자 속성 업데이트
  • 비밀번호를 확인하기 위한 대역 외 작업 흐름을 거치지 않고 이메일 확인
  • 변경사항을 취소하기 위한 이메일 링크를 보내지 않고 사용자 이메일 변경
  • SMS 확인 흐름을 거치지 않고 전화번호로 새 사용자 생성
  • SMS 확인 흐름을 거치지 않고 사용자의 전화번호 변경
  • 중지 상태에서 오프라인으로 사용자 프로비저닝한 후 사용자를 사용 설정할 시기를 나중에 제어
  • 특정 애플리케이션의 사용자 관리 시스템에 맞는 맞춤 사용자 콘솔 빌드

시작하기 전에

Firebase Admin SDK가 제공하는 사용자 관리 API를 사용하려면 서비스 계정이 있어야 합니다. Admin SDK를 초기화하는 자세한 방법은 설정 안내를 참조하세요.

사용자 데이터 검색

사용자를 식별하는 기본 방식은 사용자의 고유 식별자인 사용자의 uid를 사용하는 것입니다. Admin SDK는 uid에 따라 사용자의 프로필 정보를 가져오는 메소드를 제공합니다.

Node.js

admin.auth().getUser(uid)
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully fetched user data:', userRecord.toJSON());
  })
  .catch(function(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))

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)

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

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

사용자의 uid 대신 사용자의 이메일이 있을 수도 있습니다. Firebase Admin SDK는 이메일로 사용자 정보를 조회하는 기능을 지원합니다.

Node.js

admin.auth().getUserByEmail(email)
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully fetched user data:', userRecord.toJSON());
  })
  .catch(function(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))

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)

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

제공된 이메일이 기존 사용자에게 속하지 않거나 기타 이유로 사용자를 가져올 수 없는 경우 Admin SDK에서 오류가 발생합니다. 설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.

사용자의 uid 대신 전화번호가 있을 수도 있습니다. Firebase Admin SDK는 전화번호로 사용자 정보를 조회하는 기능을 지원합니다.

Node.js

admin.auth().getUserByPhoneNumber(phoneNumber)
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully fetched user data:', userRecord.toJSON());
  })
  .catch(function(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))

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)

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

제공된 전화번호가 기존 사용자에게 속하지 않거나 기타 이유로 사용자를 가져올 수 없는 경우 Admin SDK에서 오류가 발생합니다. 설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.

사용자 생성하기

Admin SDK는 Firebase 인증 사용자를 새로 만드는 메소드를 제공합니다. 이 메소드는 새로 만든 사용자 계정에 포함할 프로필 정보가 들어 있는 객체를 취합니다.

Node.js

admin.auth().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(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch(function(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))

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)

기본적으로 Firebase 인증은 새 사용자에 대한 임의 uid를 생성합니다. 새 사용자의 uid를 직접 지정하려면 사용자 생성 메소드에 전달하는 인수에 포함하면 됩니다.

Node.js

admin.auth().createUser({
  uid: 'some-uid',
  email: 'user@example.com',
  phoneNumber: '+11234567890'
})
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch(function(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))

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)

다음 속성을 원하는 대로 조합하여 제공할 수 있습니다.

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

속성 유형 설명
uid 문자열 새로 만든 사용자에게 할당할 uid. 1~128자인 문자열이어야 합니다. 제공하지 않은 경우 자동으로 임의 uid가 생성됩니다.
email 문자열 사용자의 기본 이메일. 유효한 이메일 주소를 입력하십시오.
emailVerified 부울 사용자의 기본 이메일이 확인되었는지 여부. 제공하지 않은 경우 기본값은 false입니다.
phoneNumber 문자열 사용자의 기본 전화번호입니다. 유효한 E.164 사양과 호환되는 전화번호여야 합니다.
password 문자열 사용자의 해시되지 않은 원시 비밀번호. 6자(영문 기준) 이상이어야 합니다.
displayName 문자열 사용자의 표시 이름
photoURL 문자열 사용자의 사진 URL
disabled 부울 사용자가 중지되었는지 여부. 중지된 경우 true, 사용 설정된 경우 false. 제공하지 않은 경우 기본값은 false입니다.

사용자 생성 메소드는 새로 만들어진 사용자의 UserRecord 객체를 반환합니다.

제공된 uid, 이메일 또는 전화번호를 기존 사용자가 이미 사용하고 있거나 기타 이유로 사용자를 만들 수 없는 경우 위 메소드가 실패하고 오류가 발생합니다. 설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.

사용자 업데이트

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

Node.js

admin.auth().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(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully updated user', userRecord.toJSON());
  })
  .catch(function(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))

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)

다음 속성을 원하는 대로 조합하여 제공할 수 있습니다.

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

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

사용자 업데이트 메소드는 업데이트가 정상적으로 완료되면 업데이트된 UserRecord 객체를 반환합니다.

제공된 uid가 기존 사용자에 해당하지 않거나, 제공된 이메일 또는 전화번호를 기존 사용자가 이미 사용하고 있거나, 기타 이유로 사용자를 업데이트할 수 없는 경우 위 메소드가 실패하고 오류가 발생합니다. 설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.

사용자 삭제하기

Firebase Admin SDK는 uid에 따라 기존 사용자를 삭제하는 기능을 지원합니다.

Node.js

admin.auth().deleteUser(uid)
  .then(function() {
    console.log('Successfully deleted user');
  })
  .catch(function(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')

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)

사용자 삭제 메소드는 삭제가 정상적으로 완료되면 빈 결과를 반환합니다.

제공된 uid가 기존 사용자에 해당하지 않거나 기타 이유로 사용자를 삭제할 수 없는 경우 사용자 삭제 메소드에서 오류가 발생합니다. 설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.

모든 사용자 나열

Firebase Admin SDK를 사용하여 전체 사용자 목록을 배치별로 검색할 수 있습니다.

Node.js

function listAllUsers(nextPageToken) {
  // List batch of users, 1000 at a time.
  admin.auth().listUsers(1000, nextPageToken)
    .then(function(listUsersResult) {
      listUsersResult.users.forEach(function(userRecord) {
        console.log('user', userRecord.toJSON());
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch(function(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)

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

각 결과 배치에는 사용자 목록과 함께 다음 사용자 배치를 나열하는 데 사용되는 다음 페이지 토큰이 들어 있습니다. 모든 사용자가 이미 나열된 경우 pageToken이 반환되지 않습니다. 또한 이 API는 사용자가 비밀번호 사용자인 경우 Firebase 인증 백엔드에서 해싱한 passwordSaltpasswordHash를 반환합니다.

maxResults 필드를 지정하지 않으면 기본적으로 배치당 사용자 1,000명이 포함됩니다. 한 번에 나열할 수 있는 최대 사용자 수도 이 숫자로 제한됩니다. 최댓값보다 큰 값은 인수 오류를 발생시킵니다. pageToken을 지정하지 않으면 맨 처음 사용자부터 uid 순으로 나열됩니다.

설명 및 해결 단계가 포함된 전체 오류 코드 목록은 Admin Authentication API 오류를 참조하세요.