The Firebase Admin SDK provides an API for managing your Firebase Authentication users with elevated privileges. The admin user management API gives you the ability to programmatically complete the following tasks from a secure server environment:
- Create new users without any throttling or rate limiting.
- Look up users by different criteria such as uid, email or phone number.
- List all the users of a specified project in batches.
- Access user metadata including account creation date and last sign-in date.
- Delete users without requiring their existing password.
- Update user properties - including their password - without having to sign in as the user.
- Verify emails without having to go through the out-of-band action flows for verifying emails.
- Change a user's email without sending email links to revoke these changes.
- Create a new user with a phone number without having to go through the SMS verification flow.
- Change a user's phone number without having to go through the SMS verification flow.
- Offline provision users in a disabled state and then later control when to enable them.
- Build custom user consoles that are tailored to a specific application's user management system.
Before you begin
To use the user management API provided by the Firebase Admin SDK, you must have a service account. Follow the setup instructions for more information on how to initialize the Admin SDK.
Retrieve user data
The primary way to identify a user is by their uid 
, a unique identifier for
that user. The Admin SDK provides a method that allows fetching the profile
information of users by their uid 
:
Node.js
  getAuth 
 () 
  
 . 
 getUser 
 ( 
 uid 
 ) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 `Successfully fetched user data: 
 ${ 
 userRecord 
 . 
 toJSON 
 () 
 } 
 ` 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error fetching user data:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 getUser 
 ( 
 uid 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully fetched user data: " 
  
 + 
  
 userRecord 
 . 
 getUid 
 ()); 
 
 
Python
  from 
  
 firebase_admin 
  
 import 
 auth 
 user 
 = 
 auth 
 . 
 get_user 
 ( 
 uid 
 ) 
 print 
 ( 
 f 
 'Successfully fetched user data: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  // Get an auth client from the firebase.App 
 client 
 , 
  
 err 
  
 := 
  
 app 
 . 
 Auth 
 ( 
 ctx 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error getting Auth client: %v\n" 
 , 
  
 err 
 ) 
 } 
 u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 GetUser 
 ( 
 ctx 
 , 
  
 uid 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error getting user %s: %v\n" 
 , 
  
 uid 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully fetched user data: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 GetUserAsync 
 ( 
 uid 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully fetched user data: {userRecord.Uid}" 
 ); 
 
 
This method returns a UserRecord 
object for the user corresponding to the uid 
provided to the method.
If the provided uid 
does not belong to an existing user or the user cannot be
fetched for any other reason, the above method throws an error.
For a full list of error codes, including descriptions and
resolution steps, see Admin Auth API Errors 
.
In some cases you will have a user's email instead of their uid 
. The Firebase
Admin SDK supports looking up user information with an email:
Node.js
  getAuth 
 () 
  
 . 
 getUserByEmail 
 ( 
 email 
 ) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 `Successfully fetched user data: 
 ${ 
 userRecord 
 . 
 toJSON 
 () 
 } 
 ` 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error fetching user data:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 getUserByEmail 
 ( 
 email 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully fetched user data: " 
  
 + 
  
 userRecord 
 . 
 getEmail 
 ()); 
 
 
Python
  from 
  
 firebase_admin 
  
 import 
 auth 
 user 
 = 
 auth 
 . 
 get_user_by_email 
 ( 
 email 
 ) 
 print 
 ( 
 f 
 'Successfully fetched user data: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 GetUserByEmail 
 ( 
 ctx 
 , 
  
 email 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error getting user by email %s: %v\n" 
 , 
  
 email 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully fetched user data: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 GetUserByEmailAsync 
 ( 
 email 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully fetched user data: {userRecord.Uid}" 
 ); 
 
 
This method returns a UserRecord 
object for the
user corresponding to the email provided.
If the provided email does not belong to an existing user or the user cannot be fetched for any other reason, the Admin SDK throws an error. For a full list of error codes, including descriptions and resolution steps, see Admin Authentication API Errors .
In other cases, you will have a user's phone number instead of their uid 
. The
Firebase Admin SDK supports looking up user information with a phone number:
Node.js
  getAuth 
 () 
  
 . 
 getUserByPhoneNumber 
 ( 
 phoneNumber 
 ) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 `Successfully fetched user data: 
 ${ 
 userRecord 
 . 
 toJSON 
 () 
 } 
 ` 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error fetching user data:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 getUserByPhoneNumber 
 ( 
 phoneNumber 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully fetched user data: " 
  
 + 
  
 userRecord 
 . 
 getPhoneNumber 
 ()); 
 
 
Python
  from 
  
 firebase_admin 
  
 import 
 auth 
 user 
 = 
 auth 
 . 
 get_user_by_phone_number 
 ( 
 phone 
 ) 
 print 
 ( 
 f 
 'Successfully fetched user data: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 GetUserByPhoneNumber 
 ( 
 ctx 
 , 
  
 phone 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error getting user by phone %s: %v\n" 
 , 
  
 phone 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully fetched user data: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 GetUserByPhoneNumberAsync 
 ( 
 phoneNumber 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully fetched user data: {userRecord.Uid}" 
 ); 
 
 
This method returns a UserRecord 
object for the
user corresponding to the phone number provided.
If the provided phone number does not belong to an existing user or the user cannot be fetched for any other reason, the Admin SDK throws an error. For a full list of error codes, including descriptions and resolution steps, see Admin Authentication API Errors .
Bulk retrieve user data
The Firebase Admin SDK also allows retrieving a list of users based on identifiers that you provide. You can identify users by their user ID, email, or phone number. A maximum of 100 identifiers can be supplied in a single call. Identifiers can contain a mix of types:
Node.js
  getAuth 
 () 
  
 . 
 getUsers 
 ([ 
  
 { 
  
 uid 
 : 
  
 'uid1' 
  
 }, 
  
 { 
  
 email 
 : 
  
 'user2@example.com' 
  
 }, 
  
 { 
  
 phoneNumber 
 : 
  
 '+15555550003' 
  
 }, 
  
 { 
  
 providerId 
 : 
  
 'google.com' 
 , 
  
 providerUid 
 : 
  
 'google_uid4' 
  
 }, 
  
 ]) 
  
 . 
 then 
 (( 
 getUsersResult 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Successfully fetched user data:' 
 ); 
  
 getUsersResult 
 . 
 users 
 . 
 forEach 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 userRecord 
 ); 
  
 }); 
  
 console 
 . 
 log 
 ( 
 'Unable to find users corresponding to these identifiers:' 
 ); 
  
 getUsersResult 
 . 
 notFound 
 . 
 forEach 
 (( 
 userIdentifier 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 userIdentifier 
 ); 
  
 }); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error fetching user data:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  GetUsersResult 
  
 result 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 getUsersAsync 
 ( 
 Arrays 
 . 
 asList 
 ( 
  
 new 
  
 UidIdentifier 
 ( 
 "uid1" 
 ), 
  
 new 
  
 EmailIdentifier 
 ( 
 "user2@example.com" 
 ), 
  
 new 
  
 PhoneIdentifier 
 ( 
 "+15555550003" 
 ), 
  
 new 
  
 ProviderIdentifier 
 ( 
 "google.com" 
 , 
  
 "google_uid4" 
 ))). 
 get 
 (); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully fetched user data:" 
 ); 
 for 
  
 ( 
 UserRecord 
  
 user 
  
 : 
  
 result 
 . 
 getUsers 
 ()) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 user 
 . 
 getUid 
 ()); 
 } 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Unable to find users corresponding to these identifiers:" 
 ); 
 for 
  
 ( 
 UserIdentifier 
  
 uid 
  
 : 
  
 result 
 . 
 getNotFound 
 ()) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 uid 
 ); 
 } 
 
 
Python
  from 
  
 firebase_admin 
  
 import 
 auth 
 result 
 = 
 auth 
 . 
 get_users 
 ([ 
 auth 
 . 
 UidIdentifier 
 ( 
 'uid1' 
 ), 
 auth 
 . 
 EmailIdentifier 
 ( 
 'user2@example.com' 
 ), 
 auth 
 . 
 PhoneIdentifier 
 ( 
 + 
 15555550003 
 ), 
 auth 
 . 
 ProviderIdentifier 
 ( 
 'google.com' 
 , 
 'google_uid4' 
 ) 
 ]) 
 print 
 ( 
 'Successfully fetched user data:' 
 ) 
 for 
 user 
 in 
 result 
 . 
 users 
 : 
 print 
 ( 
 user 
 . 
 uid 
 ) 
 print 
 ( 
 'Unable to find users corresponding to these identifiers:' 
 ) 
 for 
 uid 
 in 
 result 
 . 
 not_found 
 : 
 print 
 ( 
 uid 
 ) 
 
 
Go
  getUsersResult 
 , 
  
 err 
  
 := 
  
 client 
 . 
 GetUsers 
 ( 
 ctx 
 , 
  
 [] 
 auth 
 . 
 UserIdentifier 
 { 
  
 auth 
 . 
 UIDIdentifier 
 { 
 UID 
 : 
  
 "uid1" 
 }, 
  
 auth 
 . 
 EmailIdentifier 
 { 
 Email 
 : 
  
 "user@example.com" 
 }, 
  
 auth 
 . 
 PhoneIdentifier 
 { 
 PhoneNumber 
 : 
  
 "+15555551234" 
 }, 
  
 auth 
 . 
 ProviderIdentifier 
 { 
 ProviderID 
 : 
  
 "google.com" 
 , 
  
 ProviderUID 
 : 
  
 "google_uid1" 
 }, 
 }) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error retriving multiple users: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully fetched user data:" 
 ) 
 for 
  
 _ 
 , 
  
 u 
  
 := 
  
 range 
  
 getUsersResult 
 . 
 Users 
  
 { 
  
 log 
 . 
 Printf 
 ( 
 "%v" 
 , 
  
 u 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Unable to find users corresponding to these identifiers:" 
 ) 
 for 
  
 _ 
 , 
  
 id 
  
 := 
  
 range 
  
 getUsersResult 
 . 
 NotFound 
  
 { 
  
 log 
 . 
 Printf 
 ( 
 "%v" 
 , 
  
 id 
 ) 
 } 
 
 
C#
  GetUsersResult 
  
 result 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 GetUsersAsync 
 ( 
  
 new 
  
 List<UserIdentifier> 
  
 { 
  
 new 
  
 UidIdentifier 
 ( 
 "uid1" 
 ), 
  
 new 
  
 EmailIdentifier 
 ( 
 "user2@example.com" 
 ), 
  
 new 
  
 PhoneIdentifier 
 ( 
 "+15555550003" 
 ), 
  
 new 
  
 ProviderIdentifier 
 ( 
 "google.com" 
 , 
  
 "google_uid4" 
 ), 
  
 }); 
 Console 
 . 
 WriteLine 
 ( 
 "Successfully fetched user data:" 
 ); 
 foreach 
  
 ( 
 UserRecord 
  
 user 
  
 in 
  
 result 
 . 
 Users 
 ) 
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 $"User: {user.Uid}" 
 ); 
 } 
 Console 
 . 
 WriteLine 
 ( 
 "Unable to find users corresponding to these identifiers:" 
 ); 
 foreach 
  
 ( 
 UserIdentifier 
  
 uid 
  
 in 
  
 result 
 . 
 NotFound 
 ) 
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 $"{uid}" 
 ); 
 } 
 
 
This method returns a list the same size as the input list, with each entry
containing either the corresponding UserRecord 
or an error indicating why
that identifier was not able to be looked up. For a full list of error codes,
including descriptions and resolution steps, see Admin Authentication 
API
Errors 
.
Create a user
The Admin SDK provides a method that allows you to create a new Firebase Authentication user. This method accepts an object containing the profile information to include in the newly created user account:
Node.js
  getAuth 
 () 
  
 . 
 createUser 
 ({ 
  
 email 
 : 
  
 'user@example.com' 
 , 
  
 emailVerified 
 : 
  
 false 
 , 
  
 phoneNumber 
 : 
  
 '+11234567890' 
 , 
  
 password 
 : 
  
 'secretPassword' 
 , 
  
 displayName 
 : 
  
 'John Doe' 
 , 
  
 photoURL 
 : 
  
 'http://www.example.com/12345678/photo.png' 
 , 
  
 disabled 
 : 
  
 false 
 , 
  
 }) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 'Successfully created new user:' 
 , 
  
 userRecord 
 . 
 uid 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error creating new user:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  CreateRequest 
  
 request 
  
 = 
  
 new 
  
 CreateRequest 
 () 
  
 . 
 setEmail 
 ( 
 "user@example.com" 
 ) 
  
 . 
 setEmailVerified 
 ( 
 false 
 ) 
  
 . 
 setPassword 
 ( 
 "secretPassword" 
 ) 
  
 . 
 setPhoneNumber 
 ( 
 "+11234567890" 
 ) 
  
 . 
 setDisplayName 
 ( 
 "John Doe" 
 ) 
  
 . 
 setPhotoUrl 
 ( 
 "http://www.example.com/12345678/photo.png" 
 ) 
  
 . 
 setDisabled 
 ( 
 false 
 ); 
 UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 createUser 
 ( 
 request 
 ); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully created new user: " 
  
 + 
  
 userRecord 
 . 
 getUid 
 ()); 
 
 
Python
  user 
 = 
 auth 
 . 
 create_user 
 ( 
 email 
 = 
 'user@example.com' 
 , 
 email_verified 
 = 
 False 
 , 
 phone_number 
 = 
 '+15555550100' 
 , 
 password 
 = 
 'secretPassword' 
 , 
 display_name 
 = 
 'John Doe' 
 , 
 photo_url 
 = 
 'http://www.example.com/12345678/photo.png' 
 , 
 disabled 
 = 
 False 
 ) 
 print 
 ( 
 f 
 'Sucessfully created new user: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  params 
  
 := 
  
 ( 
& auth 
 . 
 UserToCreate 
 {}). 
  
 Email 
 ( 
 "user@example.com" 
 ). 
  
 EmailVerified 
 ( 
 false 
 ). 
  
 PhoneNumber 
 ( 
 "+15555550100" 
 ). 
  
 Password 
 ( 
 "secretPassword" 
 ). 
  
 DisplayName 
 ( 
 "John Doe" 
 ). 
  
 PhotoURL 
 ( 
 "http://www.example.com/12345678/photo.png" 
 ). 
  
 Disabled 
 ( 
 false 
 ) 
 u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 CreateUser 
 ( 
 ctx 
 , 
  
 params 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error creating user: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully created user: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecordArgs 
  
 args 
  
 = 
  
 new 
  
 UserRecordArgs 
 () 
 { 
  
 Email 
  
 = 
  
 "user@example.com" 
 , 
  
 EmailVerified 
  
 = 
  
 false 
 , 
  
 PhoneNumber 
  
 = 
  
 "+11234567890" 
 , 
  
 Password 
  
 = 
  
 "secretPassword" 
 , 
  
 DisplayName 
  
 = 
  
 "John Doe" 
 , 
  
 PhotoUrl 
  
 = 
  
 "http://www.example.com/12345678/photo.png" 
 , 
  
 Disabled 
  
 = 
  
 false 
 , 
 }; 
 UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 CreateUserAsync 
 ( 
 args 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully created new user: {userRecord.Uid}" 
 ); 
 
 
By default, Firebase Authentication 
will generate a random uid 
for the new user. If
you instead want to specify your own uid 
for the new user, you can include it
as an argument passed to the user creation method:
Node.js
  getAuth 
 () 
  
 . 
 createUser 
 ({ 
  
 uid 
 : 
  
 'some-uid' 
 , 
  
 email 
 : 
  
 'user@example.com' 
 , 
  
 phoneNumber 
 : 
  
 '+11234567890' 
 , 
  
 }) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 'Successfully created new user:' 
 , 
  
 userRecord 
 . 
 uid 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error creating new user:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  CreateRequest 
  
 request 
  
 = 
  
 new 
  
 CreateRequest 
 () 
  
 . 
 setUid 
 ( 
 "some-uid" 
 ) 
  
 . 
 setEmail 
 ( 
 "user@example.com" 
 ) 
  
 . 
 setPhoneNumber 
 ( 
 "+11234567890" 
 ); 
 UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 createUser 
 ( 
 request 
 ); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully created new user: " 
  
 + 
  
 userRecord 
 . 
 getUid 
 ()); 
 
 
Python
  user 
 = 
 auth 
 . 
 create_user 
 ( 
 uid 
 = 
 'some-uid' 
 , 
 email 
 = 
 'user@example.com' 
 , 
 phone_number 
 = 
 '+15555550100' 
 ) 
 print 
 ( 
 f 
 'Sucessfully created new user: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  params 
  
 := 
  
 ( 
& auth 
 . 
 UserToCreate 
 {}). 
  
 UID 
 ( 
 uid 
 ). 
  
 Email 
 ( 
 "user@example.com" 
 ). 
  
 PhoneNumber 
 ( 
 "+15555550100" 
 ) 
 u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 CreateUser 
 ( 
 ctx 
 , 
  
 params 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error creating user: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully created user: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecordArgs 
  
 args 
  
 = 
  
 new 
  
 UserRecordArgs 
 () 
 { 
  
 Uid 
  
 = 
  
 "some-uid" 
 , 
  
 Email 
  
 = 
  
 "user@example.com" 
 , 
  
 PhoneNumber 
  
 = 
  
 "+11234567890" 
 , 
 }; 
 UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 CreateUserAsync 
 ( 
 args 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully created new user: {userRecord.Uid}" 
 ); 
 
 
Any combination of the following properties can be provided:
Table 1. Properties supported by the create user operation
| Property | Type | Description | 
|---|---|---|
| uid | string | The uidto assign to the newly created user. Must be a
      string between 1-128 characters long, inclusive. If not provided, a
      randomuidwill be automatically generated. Shorteruids offer better performance. | 
| email | string | The user's primary email. Must be a valid email address. | 
| emailVerified | boolean | Whether or not the user's primary email is verified. If not provided, the
      default is false. | 
| phoneNumber | string | The user's primary phone number. Must be a valid E.164 spec compliant phone number. | 
| password | string | The user's raw, unhashed password. Must be at least six characters long. | 
| displayName | string | The users' display name. | 
| photoURL | string | The user's photo URL. | 
| disabled | boolean | Whether or not the user is disabled. truefor disabled;falsefor enabled. If not provided, the default isfalse. | 
The user creation method returns a UserRecord 
object for the
newly created user.
If the provided uid 
, email or phone number is already in use by an existing
user or the user cannot be created for any other reason, the above method fails
with an error. For a full list of error codes, including
descriptions and resolution steps, see Admin Authentication 
API
Errors 
.
Update a user
The Firebase Admin SDK facilitates modifying an existing user's data. You need
to specify a uid 
along with the properties to update for that user:
Node.js
  getAuth 
 () 
  
 . 
 updateUser 
 ( 
 uid 
 , 
  
 { 
  
 email 
 : 
  
 'modifiedUser@example.com' 
 , 
  
 phoneNumber 
 : 
  
 '+11234567890' 
 , 
  
 emailVerified 
 : 
  
 true 
 , 
  
 password 
 : 
  
 'newPassword' 
 , 
  
 displayName 
 : 
  
 'Jane Doe' 
 , 
  
 photoURL 
 : 
  
 'http://www.example.com/12345678/photo.png' 
 , 
  
 disabled 
 : 
  
 true 
 , 
  
 }) 
  
 . 
 then 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 // See the UserRecord reference doc for the contents of userRecord. 
  
 console 
 . 
 log 
 ( 
 'Successfully updated user' 
 , 
  
 userRecord 
 . 
 toJSON 
 ()); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error updating user:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  UpdateRequest 
  
 request 
  
 = 
  
 new 
  
 UpdateRequest 
 ( 
 uid 
 ) 
  
 . 
 setEmail 
 ( 
 "user@example.com" 
 ) 
  
 . 
 setPhoneNumber 
 ( 
 "+11234567890" 
 ) 
  
 . 
 setEmailVerified 
 ( 
 true 
 ) 
  
 . 
 setPassword 
 ( 
 "newPassword" 
 ) 
  
 . 
 setDisplayName 
 ( 
 "Jane Doe" 
 ) 
  
 . 
 setPhotoUrl 
 ( 
 "http://www.example.com/12345678/photo.png" 
 ) 
  
 . 
 setDisabled 
 ( 
 true 
 ); 
 UserRecord 
  
 userRecord 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 updateUser 
 ( 
 request 
 ); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully updated user: " 
  
 + 
  
 userRecord 
 . 
 getUid 
 ()); 
 
 
Python
  user 
 = 
 auth 
 . 
 update_user 
 ( 
 uid 
 , 
 email 
 = 
 'user@example.com' 
 , 
 phone_number 
 = 
 '+15555550100' 
 , 
 email_verified 
 = 
 True 
 , 
 password 
 = 
 'newPassword' 
 , 
 display_name 
 = 
 'John Doe' 
 , 
 photo_url 
 = 
 'http://www.example.com/12345678/photo.png' 
 , 
 disabled 
 = 
 True 
 ) 
 print 
 ( 
 f 
 'Sucessfully updated user: 
 { 
 user 
 . 
 uid 
 } 
 ' 
 ) 
 
 
Go
  params 
  
 := 
  
 ( 
& auth 
 . 
 UserToUpdate 
 {}). 
  
 Email 
 ( 
 "user@example.com" 
 ). 
  
 EmailVerified 
 ( 
 true 
 ). 
  
 PhoneNumber 
 ( 
 "+15555550100" 
 ). 
  
 Password 
 ( 
 "newPassword" 
 ). 
  
 DisplayName 
 ( 
 "John Doe" 
 ). 
  
 PhotoURL 
 ( 
 "http://www.example.com/12345678/photo.png" 
 ). 
  
 Disabled 
 ( 
 true 
 ) 
 u 
 , 
  
 err 
  
 := 
  
 client 
 . 
 UpdateUser 
 ( 
 ctx 
 , 
  
 uid 
 , 
  
 params 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error updating user: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully updated user: %v\n" 
 , 
  
 u 
 ) 
  
 
 
C#
  UserRecordArgs 
  
 args 
  
 = 
  
 new 
  
 UserRecordArgs 
 () 
 { 
  
 Uid 
  
 = 
  
 uid 
 , 
  
 Email 
  
 = 
  
 "modifiedUser@example.com" 
 , 
  
 PhoneNumber 
  
 = 
  
 "+11234567890" 
 , 
  
 EmailVerified 
  
 = 
  
 true 
 , 
  
 Password 
  
 = 
  
 "newPassword" 
 , 
  
 DisplayName 
  
 = 
  
 "Jane Doe" 
 , 
  
 PhotoUrl 
  
 = 
  
 "http://www.example.com/12345678/photo.png" 
 , 
  
 Disabled 
  
 = 
  
 true 
 , 
 }; 
 UserRecord 
  
 userRecord 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 UpdateUserAsync 
 ( 
 args 
 ); 
 // See the UserRecord reference doc for the contents of userRecord. 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully updated user: {userRecord.Uid}" 
 ); 
 
 
Any combination of the following properties can be provided:
Table 2. Properties supported by the update user operation
| Property | Type | Description | 
|---|---|---|
| email | string | The user's new primary email. Must be a valid email address. | 
| emailVerified | boolean | Whether or not the user's primary email is verified. If not provided, the
      default is false. | 
| phoneNumber | string | null | The user's new primary phone number. Must be a valid E.164 spec compliant
      phone number. Set to nullto clear the user's existing
      phone number. | 
| password | string | The user's new raw, unhashed password. Must be at least six characters long. | 
| displayName | string | null | The users' new display name. Set to nullto clear the user's
      existing display name. | 
| photoURL | string | null | The users' new photo URL. Set to nullto clear the user's
      existing photo URL. If non-null, must be a valid URL. | 
| disabled | boolean | Whether or not the user is disabled. truefor disabled;falsefor enabled. | 
The update user method returns an updated UserRecord 
object when the
update successfully completes.
If the provided uid 
does not correspond to an existing user, the provided
email or phone number is already in use by an existing user, or the user cannot
be updated for any other reason, the above method fails with an
error. For a full list of error codes, including descriptions and resolution
steps, see Admin Authentication 
API Errors 
.
Delete a user
The Firebase Admin SDK allows deleting existing users by their uid 
:
Node.js
  getAuth 
 () 
  
 . 
 deleteUser 
 ( 
 uid 
 ) 
  
 . 
 then 
 (() 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Successfully deleted user' 
 ); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error deleting user:' 
 , 
  
 error 
 ); 
  
 }); 
  
 
 
Java
  FirebaseAuth 
 . 
 getInstance 
 (). 
 deleteUser 
 ( 
 uid 
 ); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully deleted user." 
 ); 
 
 
Python
  auth 
 . 
 delete_user 
 ( 
 uid 
 ) 
 print 
 ( 
 'Successfully deleted user' 
 ) 
 
 
Go
  err 
  
 := 
  
 client 
 . 
 DeleteUser 
 ( 
 ctx 
 , 
  
 uid 
 ) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error deleting user: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully deleted user: %s\n" 
 , 
  
 uid 
 ) 
  
 
 
C#
  await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 DeleteUserAsync 
 ( 
 uid 
 ); 
 Console 
 . 
 WriteLine 
 ( 
 "Successfully deleted user." 
 ); 
 
 
The delete user method returns an empty result when the deletion completes successfully.
If the provided uid 
does not correspond to an existing user or the user cannot
be deleted for any other reason, the delete user method throws an error.
For a full list of error codes, including descriptions
and resolution steps, see Admin Authentication 
API Errors 
.
Delete Multiple Users
The Firebase Admin SDK can also delete multiple users at once. However,
note that using methods like deleteUsers(uids) 
to delete multiple users at
once will not trigger onDelete() 
event handlers for Cloud Functions for Firebase 
.
This is because batch delete does not trigger a user deletion event on
each user. Delete users one at
a time if you want user deletion events to fire for each deleted user.
Node.js
  getAuth 
 () 
  
 . 
 deleteUsers 
 ([ 
 uid1 
 , 
  
 uid2 
 , 
  
 uid3 
 ]) 
  
 . 
 then 
 (( 
 deleteUsersResult 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 `Successfully deleted 
 ${ 
 deleteUsersResult 
 . 
 successCount 
 } 
 users` 
 ); 
  
 console 
 . 
 log 
 ( 
 `Failed to delete 
 ${ 
 deleteUsersResult 
 . 
 failureCount 
 } 
 users` 
 ); 
  
 deleteUsersResult 
 . 
 errors 
 . 
 forEach 
 (( 
 err 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 err 
 . 
 error 
 . 
 toJSON 
 ()); 
  
 }); 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error deleting users:' 
 , 
  
 error 
 ); 
  
 }); 
 
 
Java
  DeleteUsersResult 
  
 result 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 deleteUsersAsync 
 ( 
  
 Arrays 
 . 
 asList 
 ( 
 "uid1" 
 , 
  
 "uid2" 
 , 
  
 "uid3" 
 )). 
 get 
 (); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Successfully deleted " 
  
 + 
  
 result 
 . 
 getSuccessCount 
 () 
  
 + 
  
 " users" 
 ); 
 System 
 . 
 out 
 . 
 println 
 ( 
 "Failed to delete " 
  
 + 
  
 result 
 . 
 getFailureCount 
 () 
  
 + 
  
 " users" 
 ); 
 for 
  
 ( 
 ErrorInfo 
  
 error 
  
 : 
  
 result 
 . 
 getErrors 
 ()) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "error #" 
  
 + 
  
 error 
 . 
 getIndex 
 () 
  
 + 
  
 ", reason: " 
  
 + 
  
 error 
 . 
 getReason 
 ()); 
 } 
 
 
Python
  from 
  
 firebase_admin 
  
 import 
 auth 
 result 
 = 
 auth 
 . 
 delete_users 
 ([ 
 "uid1" 
 , 
 "uid2" 
 , 
 "uid3" 
 ]) 
 print 
 ( 
 f 
 'Successfully deleted 
 { 
 result 
 . 
 success_count 
 } 
 users' 
 ) 
 print 
 ( 
 f 
 'Failed to delete 
 { 
 result 
 . 
 failure_count 
 } 
 users' 
 ) 
 for 
 err 
 in 
 result 
 . 
 errors 
 : 
 print 
 ( 
 f 
 'error # 
 { 
 result 
 . 
 index 
 } 
 , reason: 
 { 
 result 
 . 
 reason 
 } 
 ' 
 ) 
 
 
Go
  deleteUsersResult 
 , 
  
 err 
  
 := 
  
 client 
 . 
 DeleteUsers 
 ( 
 ctx 
 , 
  
 [] 
 string 
 { 
 "uid1" 
 , 
  
 "uid2" 
 , 
  
 "uid3" 
 }) 
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error deleting users: %v\n" 
 , 
  
 err 
 ) 
 } 
 log 
 . 
 Printf 
 ( 
 "Successfully deleted %d users" 
 , 
  
 deleteUsersResult 
 . 
 SuccessCount 
 ) 
 log 
 . 
 Printf 
 ( 
 "Failed to delete %d users" 
 , 
  
 deleteUsersResult 
 . 
 FailureCount 
 ) 
 for 
  
 _ 
 , 
  
 err 
  
 := 
  
 range 
  
 deleteUsersResult 
 . 
 Errors 
  
 { 
  
 log 
 . 
 Printf 
 ( 
 "%v" 
 , 
  
 err 
 ) 
 } 
 
 
C#
  DeleteUsersResult 
  
 result 
  
 = 
  
 await 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 DeleteUsersAsync 
 ( 
 new 
  
 List<string> 
  
 { 
  
 "uid1" 
 , 
  
 "uid2" 
 , 
  
 "uid3" 
 , 
  
 }); 
 Console 
 . 
 WriteLine 
 ( 
 $"Successfully deleted {result.SuccessCount} users." 
 ); 
 Console 
 . 
 WriteLine 
 ( 
 $"Failed to delete {result.FailureCount} users." 
 ); 
 foreach 
  
 ( 
 ErrorInfo 
  
 err 
  
 in 
  
 result 
 . 
 Errors 
 ) 
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Error #{err.Index}, reason: {err.Reason}" 
 ); 
 } 
 
 
The delete users method returns a list of failures for the users that were unable to be deleted. For a full list of error codes, including descriptions and resolution steps, see Admin Authentication API Errors .
List all users
The Firebase Admin SDK allows retrieving the entire list of users in batches:
Node.js
  const 
  
 listAllUsers 
  
 = 
  
 ( 
 nextPageToken 
 ) 
  
 = 
>  
 { 
  
 // List batch of users, 1000 at a time. 
  
 getAuth 
 () 
  
 . 
 listUsers 
 ( 
 1000 
 , 
  
 nextPageToken 
 ) 
  
 . 
 then 
 (( 
 listUsersResult 
 ) 
  
 = 
>  
 { 
  
 listUsersResult 
 . 
 users 
 . 
 forEach 
 (( 
 userRecord 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'user' 
 , 
  
 userRecord 
 . 
 toJSON 
 ()); 
  
 }); 
  
 if 
  
 ( 
 listUsersResult 
 . 
 pageToken 
 ) 
  
 { 
  
 // List next batch of users. 
  
 listAllUsers 
 ( 
 listUsersResult 
 . 
 pageToken 
 ); 
  
 } 
  
 }) 
  
 . 
 catch 
 (( 
 error 
 ) 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 'Error listing users:' 
 , 
  
 error 
 ); 
  
 }); 
 }; 
 // Start listing users from the beginning, 1000 at a time. 
 listAllUsers 
 (); 
  
 
 
Java
  // Start listing users from the beginning, 1000 at a time. 
 ListUsersPage 
  
 page 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 listUsers 
 ( 
 null 
 ); 
 while 
  
 ( 
 page 
  
 != 
  
 null 
 ) 
  
 { 
  
 for 
  
 ( 
 ExportedUserRecord 
  
 user 
  
 : 
  
 page 
 . 
 getValues 
 ()) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "User: " 
  
 + 
  
 user 
 . 
 getUid 
 ()); 
  
 } 
  
 page 
  
 = 
  
 page 
 . 
 getNextPage 
 (); 
 } 
 // Iterate through all users. This will still retrieve users in batches, 
 // buffering no more than 1000 users in memory at a time. 
 page 
  
 = 
  
 FirebaseAuth 
 . 
 getInstance 
 (). 
 listUsers 
 ( 
 null 
 ); 
 for 
  
 ( 
 ExportedUserRecord 
  
 user 
  
 : 
  
 page 
 . 
 iterateAll 
 ()) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "User: " 
  
 + 
  
 user 
 . 
 getUid 
 ()); 
 } 
 
 
Python
  # Start listing users from the beginning, 1000 at a time. 
 page 
 = 
 auth 
 . 
 list_users 
 () 
 while 
 page 
 : 
 for 
 user 
 in 
 page 
 . 
 users 
 : 
 print 
 ( 
 'User: ' 
 + 
 user 
 . 
 uid 
 ) 
 # Get next batch of users. 
 page 
 = 
 page 
 . 
 get_next_page 
 () 
 # Iterate through all users. This will still retrieve users in batches, 
 # buffering no more than 1000 users in memory at a time. 
 for 
 user 
 in 
 auth 
 . 
 list_users 
 () 
 . 
 iterate_all 
 (): 
 print 
 ( 
 'User: ' 
 + 
 user 
 . 
 uid 
 ) 
 
 
Go
  // Note, behind the scenes, the Users() iterator will retrive 1000 Users at a time through the API 
 iter 
  
 := 
  
 client 
 . 
 Users 
 ( 
 ctx 
 , 
  
 "" 
 ) 
 for 
  
 { 
  
 user 
 , 
  
 err 
  
 := 
  
 iter 
 . 
 Next 
 () 
  
 if 
  
 err 
  
 == 
  
 iterator 
 . 
 Done 
  
 { 
  
 break 
  
 } 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "error listing users: %s\n" 
 , 
  
 err 
 ) 
  
 } 
  
 log 
 . 
 Printf 
 ( 
 "read user user: %v\n" 
 , 
  
 user 
 ) 
 } 
 // Iterating by pages 100 users at a time. 
 // Note that using both the Next() function on an iterator and the NextPage() 
 // on a Pager wrapping that same iterator will result in an error. 
 pager 
  
 := 
  
 iterator 
 . 
 NewPager 
 ( 
 client 
 . 
 Users 
 ( 
 ctx 
 , 
  
 "" 
 ), 
  
 100 
 , 
  
 "" 
 ) 
 for 
  
 { 
  
 var 
  
 users 
  
 [] 
 * 
 auth 
 . 
 ExportedUserRecord 
  
 nextPageToken 
 , 
  
 err 
  
 := 
  
 pager 
 . 
 NextPage 
 ( 
& users 
 ) 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 log 
 . 
 Fatalf 
 ( 
 "paging error %v\n" 
 , 
  
 err 
 ) 
  
 } 
  
 for 
  
 _ 
 , 
  
 u 
  
 := 
  
 range 
  
 users 
  
 { 
  
 log 
 . 
 Printf 
 ( 
 "read user user: %v\n" 
 , 
  
 u 
 ) 
  
 } 
  
 if 
  
 nextPageToken 
  
 == 
  
 "" 
  
 { 
  
 break 
  
 } 
 } 
  
 
 
C#
  // Start listing users from the beginning, 1000 at a time. 
 var 
  
 pagedEnumerable 
  
 = 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 ListUsersAsync 
 ( 
 null 
 ); 
 var 
  
 responses 
  
 = 
  
 pagedEnumerable 
 . 
 AsRawResponses 
 (). 
 GetAsyncEnumerator 
 (); 
 while 
  
 ( 
 await 
  
 responses 
 . 
 MoveNextAsync 
 ()) 
 { 
  
 ExportedUserRecords 
  
 response 
  
 = 
  
 responses 
 . 
 Current 
 ; 
  
 foreach 
  
 ( 
 ExportedUserRecord 
  
 user 
  
 in 
  
 response 
 . 
 Users 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 $"User: {user.Uid}" 
 ); 
  
 } 
 } 
 // Iterate through all users. This will still retrieve users in batches, 
 // buffering no more than 1000 users in memory at a time. 
 var 
  
 enumerator 
  
 = 
  
 FirebaseAuth 
 . 
 DefaultInstance 
 . 
 ListUsersAsync 
 ( 
 null 
 ). 
 GetAsyncEnumerator 
 (); 
 while 
  
 ( 
 await 
  
 enumerator 
 . 
 MoveNextAsync 
 ()) 
 { 
  
 ExportedUserRecord 
  
 user 
  
 = 
  
 enumerator 
 . 
 Current 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"User: {user.Uid}" 
 ); 
 } 
 
 
Each batch of results contains a list of users and the next page token used to
list the next batch of users. When all the users have already been listed, no pageToken 
is returned.
If no maxResults 
field is specified, the default 1000 users per batch is used.
This is also the maximum number of users allowed to be listed at a time. Any
value greater than the maximum will throw an argument error.
If no pageToken 
is specified, the operation will list users from the
beginning, ordered by uid 
.
For a full list of error codes, including descriptions and resolution steps, see Admin Authentication API Errors .
Password hashes of listed users
This API also returns the passwordSalt 
and passwordHash 
hashed by the
Firebase Auth backend for password users if the user/service account used to
generate the request OAuth access token has the firebaseauth.configs.getHashConfig 
permission. Otherwise the passwordHash 
and passwordSalt 
will not be set.
Due to the sensitive nature of password hashes, the Firebase Admin SDK service
account does not have the firebaseauth.configs.getHashConfig 
permission by
default. You can't add a permission directly to a user/service account, but you
can do so indirectly by creating a custom IAM role 
.
To create the custom IAM role:
- Go to the Rolespage in IAM & adminpanel in the Google Cloud console.
- Select your project from the drop-down at the top of the page.
- Click CREATE ROLE
- Click ADD PERMISSIONS
- Search for firebaseauth.configs.getHashConfigpermission and select that checkbox.
- Click ADD
- Click CREATEto finish creating the new role.
Add the created custom role to the user/service account in the IAM page:
- In the IAM & adminpanel, select IAM
- Select the service or user account from the list of members for editing.
- Click ADD ANOTHER ROLE.
- Search for the new custom role previously created.
- Click SAVE.

