'Create user with firebase admin sdk that can signIn using email and password

I'm using firebase admin SDK on cloud functions to create users using

  admin.auth().createUser({
email: someEmail,
password: somePassword,
})

now I want user to signIn using signInWithEmailAndPassword('someEmail', 'somePassword') but I cannot. I get the following error

{code: "auth/user-not-found", message: "There is no user record corresponding to this identifier. The user may have been deleted."}


Solution 1:[1]

There doesn't seem to be a reason to Stringify/Parse. This worked after I struggled with an unrelated typo...

FUNCTION CALL FROM REACT JS BUTTON CLICK

     <Button onClick={() => {
                    var data = {
                        "email": "[email protected]",
                        "emailVerified": true,
                        "phoneNumber": "+15551212",
                        "password": "randomPW",
                        "displayName": "User Name",
                        "disabled": false,
                        "sponsor": "Extra Payload #1 (optional)",
                        "study": "Extra Payload #2 (optional)"
                    };
                    var createUser = firebase.functions().httpsCallable('createUser');
                    createUser( data ).then(function (result) {
                        // Read result of the Cloud Function.
                        console.log(result.data)
                    });
                }}>Create User</Button>

And in the index.js in your /functions subdirectory:

const functions = require("firebase-functions");
const admin = require('firebase-admin');
admin.initializeApp();

// CREATE NEW USER IN FIREBASE BY FUNCTION
exports.createUser = functions.https.onCall(async (data, context) => {
  try {
    const user = await admin.auth().createUser({
      email: data.email,
      emailVerified: true,
      password: data.password,
      displayName: data.displayName,
      disabled: false,
    });
    return {
      response: user
    };
} catch (error) {
    throw new functions.https.HttpsError('failed to create a user');
  }
});

Screen shot of console output

Solution 2:[2]

In 2022 there still is no method built into the Admin SDK that would allow to create users in the emulator.

What you can do is to use the REST API of the emulator to create users there directly. The API is documented here: https://firebase.google.com/docs/reference/rest/auth#section-create-email-password

Provided you have got and nanoid installed you can use the following code to create users in the emulator.

import { nanoid } from 'nanoid'
import httpClientFor from '../lib/http-client/client.js'
const httpClient = httpClientFor('POST')

export const createTestUser = async ({ email = `test-${nanoid(5)}@example.io`, password = nanoid(10), displayName = 'Tony' } = {}) => {
const key = nanoid(31)

const { body: responseBody } = await httpClient(`http://localhost:9099/identitytoolkit.googleapis.com/v1/accounts:signUp?key=${key}`, {
    json: {
        email,
        password,
        displayName
    }
})

const responseObject = JSON.parse(responseBody)
const { localId: userId, email: userEmail, idToken, refreshToken } = responseObject

return { userId, userEmail, idToken, refreshToken }
}

Please note: As there is no error handling implemented, this snippet is not suitable for production use.

Solution 3:[3]

Try like that

And please be ensure that user is created from the panel

    admin.auth().createUser({
  email: "[email protected]",
  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);
  });

Solution 4:[4]

Just in case anyone else comes across this I was able to fix it with the help of this.

Here is a working example inside of an onCreate cloud function:

exports.newProjectLead = functions.firestore
  .document('newProjectForms/{docId}')
  .onCreate(async (snapshot) => {
    const docId = snapshot.id
    // this is what fixed it the issue
    // stringify the data
    const data = JSON.stringify(snapshot.data())
    // then parse it back to JSON
    const obj = JSON.parse(data)
    console.log(obj)
    const email = obj.contactEmail
    console.log(email)
    const password = 'ChangeMe123'
    const response = await admin.auth().createUser({
      email,
      password
    })
    data
    const uid = response.uid

    const dbRef = admin.firestore().collection(`clients`)
    await dbRef.doc(docId).set({
      id: docId,
      ...data,
      uid
    }, {
      merge: true
    })

    console.log('New Client Created')

  })

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 DeveloperOne
Solution 2 Stefan Pfaffel
Solution 3
Solution 4 Nicholas