Создание нового пользователя через 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
})
....