Я создаю API под облачными функциями Firebase и express. Я пытаюсь разработать функцию, которая создает пользователя и одновременно настраивает его профиль.
Проблема: функция не go дальше, чем createUser метод. Конечная точка возвращает ошибку 500 и нулевой ответ.
Я понял, что это был метод createUser , потому что я вставил предложение console.log до и после функции createUser например:
console.log('before createUser sentence');
const user = await admin.auth().createUser(...);
console.log('after createUser sentence');
Предложение до функции createUser было выполнено, но инструкция после функции createUser никогда не выполнялась.
Я пытался без async / await (с предложением then / catch ) и ничего не происходит.
Как видите, я разделил создание пользователя на две части: создание, правильно сказано, и обновление пользовательских полей. Это было для того, чтобы найти обходной путь из-за загадочной ошибки createUser и остался таким.
Спасибо за ваше время!
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
import * as express from 'express';
const api = express();
// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header.
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this:
// `Authorization: Bearer <Firebase ID Token>`.
// when decoded successfully, the ID Token content will be added as `req.user`.
const validateFirebaseIdToken = async (req: any, res: any, next: any) => {
console.log('Check if request is authorized with Firebase ID token');
if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) {
console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
'Make sure you authorize your request by providing the following HTTP header:',
'Authorization: Bearer <Firebase ID Token>');
res.status(403).send('Unauthorized');
return;
}
const idToken = req.headers.authorization.split('Bearer ')[1];
try {
const decodedIdToken = await admin.auth().verifyIdToken(idToken);
console.log('ID Token correctly decoded', decodedIdToken);
req.user = decodedIdToken;
next();
return;
}
catch (err) {
console.error('Error while verifying Firebase ID token:', err);
res.status(403).send('Unauthorized');
return;
}
};
const valid = (type: any, value: any) => {
if (!value) return false;
if (type === 'email') {
const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return emailRegex.test(String(value).toLowerCase());
}
else if (type === 'phone') {
const argPhoneRegex = /^(?:(?:00)?549?)?0?(?:11|[2368]\d)(?:(?=\d{0,2}15)\d{2})??\d{8}$/;
return argPhoneRegex.test(String(value).toLowerCase());
}
else if (type === 'password') {
return value.length >= 6;
}
else if (type === 'name') {
return value.length >= 3;
}
}
api.use(validateFirebaseIdToken);
api.post('/register-user', async (req: any, res: any) => {
const email = req.body.email || false;
const password = req.body.password || false;
const firstname = req.body.firstname || false;
const lastname = req.body.lastname || false;
const phone = req.body.phone || false;
if (!valid('email', email) ||
!valid('password', password) ||
!valid('name', firstname) ||
!valid('name', lastname) ||
!valid('phone', phone)) {
res.status(500).json({
error: true,
message: 'Params missing'
});
}
try {
const user = await admin.auth().createUser({
email: email,
password: password
});
const userFields = {
emailVerified: false,
displayName: `${firstname} ${lastname}`,
phoneNumber: phone,
disabled: false
};
const userProfile = {
firstname,
lastname,
phone
};
await Promise.all([
admin.firestore().doc(`profiles/${user.uid}`).set(userProfile),
admin.auth().updateUser(user.uid, userFields)
]);
res.status(200).json({
profile: userProfile
});
}
catch(err) {
res.status(500).json({
error: true,
message: err.getMessage()
});
}
});
exports.api = functions.https.onRequest(api);
РЕШЕНИЕ
Мне не хватало учетных данных внутри admin.initializeApp();
, как в документации Firebase говорит.
Спасибо @ErnestasButa!