How to just create an user in Firebase 3 and do not authenticate it?

I am working on a angularfire project and I would like to know how can I create an user in Firebase 3 and once done, do not authenticate the specified user. In the previous Firebase version we had the method called createUser(email, password). Now we have the method createUserWithEmailAndPassword(email, password) only, it creates and authenticates the specified user.


Solution 1:

The answer to the question is: you can't.

We have similar situation where we have 'admin' users that can create other users. With 2.x this was a snap. With 3.x it's a fail as that capability was completely removed.

If you create a user in 3.x you authenticate as that user, and unauthenticate the account that's logged in.

This goes deeper as you would then need to re-authenticate to create another user; so the admin either does that manually or (cringe) stores the authentication data locally so it could be an automated process (cringe cringe, please don't do this)

Firebase has publicly stressed that 2.x will continue to be supported so you may just want to avoid 3.x.

Update:

one of the Firebaser's actually came up with a workaround on this. Conceptually you had an admin user logged in. You then create a second connection to firebase and authenticate with another user, that connection then creates the new user. Rinse - repeat.

Update again

See this question and answer

Firebase kicks out current user

Solution 2:

You can do this using cloud function and firebase admin SDK. Create HTTP function like below.

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.createUser = functions.https.onRequest((request, response) => {
    if (request.method !== "POST") {
        response.status(405).send("Method Not Allowed");
    } else {
        let body = request.body;

        const email = body.email;
        const password = body.password;
        const displayName = body.displayName;

        admin.auth().createUser({
            email: email,
            emailVerified: false,
            password: password,
            displayName: displayName,
            disabled: false
        })
        .then((userRecord) => {
            return response.status(200).send("Successfully created new user: " +userRecord.uid);
        })
        .catch((error) => {
            return response.status(400).send("Failed to create user: " + error);
        });
    }
});

In your client app, call this function using Http request, for example using ajax

$.ajax({
       url: "the url generated by cloud function",
       type: "POST",
       data: {
           email: email,
           password: password,
           displayName: name
       },
       success: function(response) {
            console.log(response);
       },
       error: function(xhr, status, error) {
             let err = JSON.parse(xhr.responseText);
                 console.log(err.Message);
             }
       });