Облачные функции Firebase Аутентификация createUser неизвестная ошибка - PullRequest
0 голосов
/ 24 января 2020

Я создаю 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!

...