Я администратор и добавляю аккаунты на свой сайт. Я хотел бы, чтобы я мог добавить учетную запись без выхода из системы и входа в новую учетную запись. В любом случае, я могу избежать этого? Обновление 20161110 — оригинальный ответ ниже Также обратите внимание на

      //ADD EMPLOYEES
      addEmployees: function(formData){
        firebase.auth().createUserWithEmailAndPassword(formData.email, formData.password).then(function(data){
          console.log(data);
        });
      },

для другого подхода.

Это действительно возможно.

Но не напрямую, способ сделать это — создать вторую ссылку на аутентификацию и использовать ее для создания пользователей:. Он включает интерфейс на основе Java, который определяет URL-адреса и упрощает доступ к ним. для другого подхода.

Чтобы удалить элемент массива с индексом

Это действительно возможно.

Но не напрямую, способ сделать это — создать вторую ссылку на аутентификацию и использовать ее для создания пользователей:

var config = {apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com"};
var secondaryApp = firebase.initializeApp(config, "Secondary");

secondaryApp.auth().createUserWithEmailAndPassword(em, pwd).then(function(firebaseUser) {
    console.log("User "   firebaseUser.uid   " created successfully!");
    //I don't know if the next statement is necessary 
    secondaryApp.auth().signOut();
});

Если вы не укажете, какое соединение с firebase вы используете для операции, оно будет использовать первое, используя дефолт.

Источник для нескольких ссылок на приложения.

I Вместо этого используйте любой из методов, ранее упомянутых другими: свойство

Для фактического создания нового пользователя не имеет значения, что нет никого или кого-то еще, кроме администратора, прошедшего аутентификацию по второй ссылке на аутентификацию, потому что для создания учетной записи вам нужна только ссылка на аутентификацию.

Следующее не было проверено, но есть над чем подумать

Вы должны подумать о записи данных в базу данных. Обычная практика заключается в том, что пользователи могут редактировать / обновлять свою собственную информацию о пользователях, поэтому, когда вы используете для записи вторую ссылку на аутентификацию, это должно работать. Но если у вас есть что-то вроде ролей или разрешений для этого пользователя, убедитесь, что вы пишете это со ссылкой на аутентификацию, которая имеет необходимые разрешения. В этом случае основной аутентификацией является администратор, а второй аутентификацией является вновь созданный пользователь.

Firebase только что выпустила свой пакет Firebase-Admin SDK, который позволяет использовать код на стороне сервера для этого и других распространенных административных сценариев использования. Прочитайте инструкции по установке , а затем погрузитесь в документацию по созданию пользователей Глядя на вывод

Чтобы удалить элемент массива с индексом

. В настоящее время это невозможно. Создавая пароль электронной почты, пользователь автоматически подписывает этого нового пользователя.

Я получил очень умный обходной путь Андре , работающий в Objective-C с использованием Firebase iOS SDK :

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *secondaryAppOptions = [[FIROptions alloc] initWithContentsOfFile:plistPath];
[FIRApp configureWithName:@"Secondary" options:secondaryAppOptions];
FIRApp *secondaryApp = [FIRApp appNamed:@"Secondary"];
FIRAuth *secondaryAppAuth = [FIRAuth authWithApp:secondaryApp];

[secondaryAppAuth createUserWithEmail:user.email
                             password:user.password
                           completion:^(FIRUser * _Nullable user, NSError * _Nullable error) {
                                [secondaryAppAuth signOut:nil];
                          }];

Я только что создал функцию Firebase, которая срабатывает при создании документа Firestore (с правилами только для записи для администратора). Затем используйте admin.auth (). CreateUser () для правильного создания нового пользователя.

export const createUser = functions.firestore
.document('newUsers/{userId}')
.onCreate(async (snap, context) => {
    const userId = context.params.userId;
    const newUser = await admin.auth().createUser({
        disabled: false,
        displayName: snap.get('displayName'),
        email: snap.get('email'),
        password: snap.get('password'),
        phoneNumber: snap.get('phoneNumber')
    });
    // You can also store the new user in another collection with extra fields
    await admin.firestore().collection('users').doc(newUser.uid).set({
        uid: newUser.uid,
        email: newUser.email,
        name: newUser.displayName,
        phoneNumber: newUser.phoneNumber,
        otherfield: snap.get('otherfield'),
        anotherfield: snap.get('anotherfield')
    });
    // Delete the temp document
    return admin.firestore().collection('newUsers').doc(userId).delete();
});

Вы также можете использовать functions.https.onCall ()

exports.createUser= functions.https.onCall((data, context) => {
    const uid = context.auth.uid; // Authorize as you want
    // ... do the same logic as above
});

, вызывая его.

const createUser = firebase.functions().httpsCallable('createUser');
createUser({userData: data}).then(result => {
    // success or error handling
});

Обновление для Swift 4

Я испробовал несколько разных вариантов создания нескольких пользователей из одной учетной записи, но это, безусловно, лучшее и простое решение.

Оригинальный ответ Нико

Сначала настройте firebase в своем файле AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    FirebaseApp.configure(name: "CreatingUsersApp", options: FirebaseApp.app()!.options)

    return true
}

Добавьте следующий код в действие, где вы создаете учетные записи.

            if let secondaryApp = FirebaseApp.app(name: "CreatingUsersApp") {
                let secondaryAppAuth = Auth.auth(app: secondaryApp)

                // Create user in secondary app.
                secondaryAppAuth.createUser(withEmail: email, password: password) { (user, error) in
                    if error != nil {
                        print(error!)
                    } else {
                        //Print created users email.
                        print(user!.email!)

                        //Print current logged in users email.
                        print(Auth.auth().currentUser?.email ?? "default")

                        try! secondaryAppAuth.signOut()

                    }
                }
            }
        }

Версия Swift:

FIRApp.configure()

// Creating a second app to create user without logging in
FIRApp.configure(withName: "CreatingUsersApp", options: FIRApp.defaultApp()!.options)

if let secondaryApp = FIRApp(named: "CreatingUsersApp") {
    let secondaryAppAuth = FIRAuth(app: secondaryApp)
    secondaryAppAuth?.createUser(...)
}

Вот адаптация Swift 3 ответа Jcabrera , тогда нам нужно привязать контекст к внутренней функции.

let bundle = Bundle.main
        let path = bundle.path(forResource: "GoogleService-Info", ofType: "plist")!
        let options = FIROptions.init(contentsOfFile: path)
        FIRApp.configure(withName: "Secondary", options: options!)
        let secondary_app = FIRApp.init(named: "Secondary")
        let second_auth = FIRAuth(app : secondary_app!)
        second_auth?.createUser(withEmail: self.username.text!, password: self.password.text!)
        {
            (user,error) in
            print(user!.email!)
            print(FIRAuth.auth()?.currentUser?.email ?? "default")
        }

Если вы используете Polymer и Firebase (polyfirefire), посмотрите этот ответ: https://stackoverflow.com/ a / 46698801/1821603

По сути, вы создаете дополнительный <firebase-app> для обработки регистрации нового пользователя, не затрагивая текущего пользователя.

Android-решение (Kotlin):

  1. Боргар предложил протестировать JSONP
  2. Создайте вторичную переменную авторизации, вызвав FirebaseApp.initializeApp ()
  3. Получите экземпляр FirebaseAuth, передав только что созданную вторичную аутентификацию, и делайте все, что хотите (например, createUser)

    // 1. you can find these in your project settings under general tab
    val firebaseOptionsBuilder = FirebaseOptions.Builder()
    firebaseOptionsBuilder.setApiKey("YOUR_API_KEY")
    firebaseOptionsBuilder.setDatabaseUrl("YOUR_DATABASE_URL")
    firebaseOptionsBuilder.setProjectId("YOUR_PROJECT_ID")
    firebaseOptionsBuilder.setApplicationId("YOUR_APPLICATION_ID") //not sure if this one is needed
    val firebaseOptions = firebaseOptionsBuilder.build()
    
    // indeterminate progress dialog *ANKO*
    val progressDialog = indeterminateProgressDialog(resources.getString(R.string.progressDialog_message_registering))
    progressDialog.show()
    
    // 2. second auth created by passing the context, firebase options and a string for secondary db name
    val newAuth = FirebaseApp.initializeApp(this@ListActivity, firebaseOptions, Constants.secondary_db_auth)
    // 3. calling the create method on our newly created auth, passed in getInstance
    FirebaseAuth.getInstance(newAuth).createUserWithEmailAndPassword(email!!, password!!)
            .addOnCompleteListener { it ->
    
                if (it.isSuccessful) {
    
                    // 'it' is a Task<AuthResult>, so we can get our newly created user from result
                    val newUser = it.result.user
    
                    // store wanted values on your user model, e.g. email, name, phonenumber, etc.
                    val user = User()
                    user.email = email
                    user.name = name
                    user.created = Date().time
                    user.active = true
                    user.phone = phone
    
                    // set user model on /db_root/users/uid_of_created_user/, or wherever you want depending on your structure
                    FirebaseDatabase.getInstance().reference.child(Constants.db_users).child(newUser.uid).setValue(user)
    
                    // send newly created user email verification link
                    newUser.sendEmailVerification()
    
                    progressDialog.dismiss()
    
                    // sign him out
                    FirebaseAuth.getInstance(newAuth).signOut()
                    // DELETE SECONDARY AUTH! thanks, Jimmy :D
                    newAuth.delete()
    
                } else {
    
                    progressDialog.dismiss()
    
                    try {
    
                        throw it.exception!!
    
                        // catch exception for already existing user (e-mail)
                    } catch (e: FirebaseAuthUserCollisionException) {
    
                        alert(resources.getString(R.string.exception_FirebaseAuthUserCollision), resources.getString(R.string.alertDialog_title_error)) {
    
                            okButton {
    
                                isCancelable = false
    
                            }
    
                        }.show()
    
                    }
    
                }
    
            }
    

. Вы можете использовать функцию firebase для добавления пользователей. ,

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

const cors = require('cors')({
origin: true,
});
exports.AddUser = functions.https.onRequest(( req, res ) => {
// Grab the text parameter.

cors( req, res, ()  => {
    let email  = req.body.email;
    let passwd = req.body.passwd;
    let role   = req.body.role;
    const token = req.get('Authorization').split('Bearer ')[1];

    admin.auth().verifyIdToken(token)
    .then(
            (decoded) => { 
             // return res.status(200).send(  decoded )
             return creatUser(decoded);
            })
    .catch((err) => {
            return res.status(401).send(err) 
     });

    function creatUser(user){
      admin.auth().createUser({
          email: email,
          emailVerified: false,
          password: passwd,
          disabled: false
        })
        .then((result) => {
          console.log('result',result);
           return res.status(200).send(result);
        }).catch((error) => {
           console.log(error.message);
           return res.status(400).send(error.message);
       })
     }

   }); 
 });

Swift 5: простое решение

Сначала сохраните текущего пользователя в переменной с именем originalUser

let originalUser = Auth.auth().currentUser

Затем в обработчике завершения создания нового пользователя используйте метод updateCurrentUser для восстановления исходного пользователя

Auth.auth().updateCurrentUser(originalUser, completion: nil)

, с которым я столкнулся та же проблема, и я решил ее следующим образом:

Когда пользователь входит в систему, я сохраняю адрес электронной почты и пароль в общих настройках. И после создания пользователя я снова вхожу в систему с помощью электронной почты и пароля, которые я сохранил ранее.

    String currentEmail = MyApp.getSharedPreferences().getEmail();
    String currentPass = MyApp.getSharedPreferences().getPass();

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.createUserWithEmailAndPassword(email, pass)
            .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {

                @Override
                public void onComplete(@NonNull final Task<AuthResult> task) {

                    if (task.isSuccessful()) {
                        String currentEmail = MyApp.getSharedPreferences().getEmail();
                        String currentPass = MyApp.getSharedPreferences().getPass();

                        //Sign in again
                        auth.signInWithEmailAndPassword(currentEmail, currentPass)
                                .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                        if (!task.isSuccessful()) {
                                            Log.e("RELOGIN", "FAILED");
                                        } else {
                                            Log.e("RELOGIN", "SUCCESS");
                                        }
                                    }
                                });

                        finish();
                    }
                }
    });