Аутентификация Firebase: создайте пользователя с помощью электронной почты и пароля, но не войдите в систему [дублировать]

Text-align: center

Применяя text-align: center , встроенное содержимое центрируется в строке строки. Однако, поскольку внутренний div по умолчанию width: 100%, вы должны установить определенную ширину или использовать одно из следующих значений:

#inner {
  display: inline-block;
}

#outer {
  text-align: center;
}
Foo foo

Маржа: 0 auto

Использование margin: 0 auto - еще одна опция, и она более подходит для совместимости старых браузеров. Он работает вместе с display: table .

#inner {
  display: table;
  margin: 0 auto;
}
Foo foo

Flexbox

display: flex ведет себя как элемент блока и выдает его содержимое в соответствии с моделью flexbox. Он работает с justify-content: center .

Обратите внимание: Flexbox совместим с большинством браузеров, но не со всеми. См. здесь для полного и обновленного списка совместимости браузеров.

#inner {
  display: inline-block;
}

#outer {
  display: flex;
  justify-content: center;
}
Foo foo

Transform

transform: translate позволяет вам изменять координатное пространство модели визуального форматирования CSS. Используя его, элементы могут быть переведены, повернуты, масштабированы и перекошены. Для центрирования по горизонтали требуется position: absolute и left: 50% .

#inner {
  position: absolute;
  left: 50%;
  transform: translate(-50%, 0%);
}
Foo foo

(Устаревший)

Тег

является альтернативой HTML text-align: center . Он работает с более старыми браузерами и большинством новых, но это не считается хорошей практикой, поскольку эта функция устарела и удалена из веб-стандартов.

#inner {
  display: inline-block;
}
Foo foo
31
задан Frank van Puffelen 3 June 2016 в 12:12
поделиться

10 ответов

Вот адаптация Swift 3 ответа Кабреры :

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")
        }
58
ответ дан Community 21 August 2018 в 23:56
поделиться

Обновление 20161110 - оригинальный ответ ниже

Также проверьте этот ответ для другого подхода.

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

на самом деле возможно.

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

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 для работы, он будет использовать первый по умолчанию.

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

EDIT

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

Не тестировалось следующее, но об этом можно подумать.

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

58
ответ дан Community 21 August 2018 в 23:56
поделиться

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

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];
                          }];
3
ответ дан André Kool 21 August 2018 в 23:56
поделиться

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

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

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

Сначала сконфигурируйте 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()

                    }
                }
            }
        }
1
ответ дан BSlade 21 August 2018 в 23:56
поделиться

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

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

0
ответ дан Evan Caldwell 21 August 2018 в 23:56
поделиться

Обновление 20161108 - оригинальный ответ ниже

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

исходный ответ

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

15
ответ дан Frank van Puffelen 21 August 2018 в 23:56
поделиться

Версия 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(...)
}
0
ответ дан Nico 21 August 2018 в 23:56
поделиться

Я только что создал функцию 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();
});
0
ответ дан Paulo Busato Favarato 21 August 2018 в 23:56
поделиться

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

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

    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();
                    }
                }
    });
-2
ответ дан Sayed Hameed Ebrahim 21 August 2018 в 23:56
поделиться

У меня была аналогичная проблема, поэтому я задал вопрос в сообществе Firebase Slack. Я реализовал это и работает как шарм.

3
ответ дан srijanshukla 21 August 2018 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: