Создание нового пользователя через Firebase Cloud Functions - учетная запись создана, но не может войти

Я здесь новичок.

В настоящее время я занимаюсь разработкой приложения, использующего Vue.js с аутентификацией Firebase, базой данных Firebase в реальном времени и облачными функциями Firebase в качестве внутреннего интерфейса. Одна часть функций, которую приложение должно включать в себя учетную запись администратора, которая имеет возможность создавать учетные записи для других людей. После создания новый пользователь получает письмо с логином и паролем для входа.

Поскольку метод регистрации ( https://firebase.google.com/docs/auth/web/password-auth) автоматически перенаправляет пользователя во вновь созданную учетную запись, что, очевидно, является нежелательным поведением, я нашел способ создать пользователя через облако функции. Код успешно создает учетную запись в панели аутентификации firebase, за исключением того, что я не могу войти во вновь созданные учетные записи. Я получаю сообщение: "Пароль неверен или у пользователя нет пароля".

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

Код функции облака:

exports.createUser = functions.https.onCall((data, context) => {
console.log(data)
return admin.auth().createUser({
    email: data.email,
    emailVerified: true,
    password: data.password,
    displayName: data.email,
    disabled: false,
  })
    .then(user => {
        return {
            response: user
      }
    })
    .catch(error => {
        throw new functions.https.HttpsError('failed to create a user')
    });

});

Код входа:

signIn: async function(){
  if(this.email && this.password){

    let getUsers = firebase.functions().httpsCallable('getUsers')

    this.feedback = null
    this.spin = true

    let destination = null
    let logedUser = null
    let type = null

    this.feedback = 'Logging in...'

    await firebase.auth().signInWithEmailAndPassword(this.email, this.password)
      .then(response => {
        this.feedback = 'Authorization finished...'
        logedUser = response.user
      })
      .catch( error => {
        this.feedback = error.message
        this.spin = false
      })
//... more code here but I am certain it has nothing to do with the problem.

1 ответ

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

Кроме того, вы фактически не вызываете облачную функцию с mail а также password параметры.

Вы должны сделать следующее, основываясь на документации.

....
let getUsers = firebase.functions().httpsCallable('getUsers')

await getUsers({email: this.email, password: this.password})
  .then(result => {
      return firebase.auth().signInWithEmailAndPassword(this.email, this.password)
  })
  .then(userCredential => {
    this.feedback = 'Authorization finished...'
    logedUser = userCredential.user
    return true
  })
  .catch( error => {
    this.feedback = error.message
    this.spin = false
  })
....
Другие вопросы по тегам