Почему при вызове функции HTTP в Google Cloud появляется ошибка UNAUTHORIZED? - PullRequest
0 голосов
/ 17 апреля 2020

Я развернул в Google Cloud функцию, которая создает новых пользователей при вызове, однако ее сбой приводит к ошибке UNAUTHORIZED , которая должна указывать на то, что токен пользователя недействителен, однако пользователь, которого я Я использую, чтобы войти установлен как "Владелец" в облачной функции.

Я удалил « Разрешить неаутентифицированную », поэтому теперь только аутентифицированные пользователи (администраторы) могут выполнять эту функцию.

Пакет. json механизм и зависимости:

  ...
  "engines": {
  "node": "8"
  },
  "dependencies": {
    "@react-native-firebase/auth": "^6.4.0",
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.6.0"
  }
  ...

My Firebase (устанавливается с npm install -g firebase-tools) версия :

firebase --version : 8.0.3 //tried the latest one 8.1.0 but it fails when I deploy so downgraded to 8.0.3

Вот функция (сокращенная до минимального кода):

exports.createUser = functions.region('europe-west1').https.onCall(async (data, context) => {
    try {
        if (!data.email.endsWith('@admin.com')) {
            throw "Wrong email domain";
        }
        if (!context.auth) {
            throw new UnauthenticatedError('The user is not authenticated. Only authenticated Admin users can create new users.');
        }

        const callerUid = context.auth.uid;
        const callerUserRecord = await admin.auth().getUser(callerUid);
        if (!callerUserRecord.customClaims.admin) {
            throw new NotAnAdminError('Only Admin users can create new users.');
        }
        const role = data.role;
        if (!roleIsValid(role)) {
            throw new InvalidRoleError('The "' + role + '" role is not a valid role');
        }

        const userCreationRequest = {
            userDetails: data,
            status: 'Pending',
            createdBy: callerUid,
            createdOn: FieldValue.serverTimestamp()
        }

        const userCreationRequestRef = await admin.firestore().collection("userCreationRequests").add(userCreationRequest);

        const newUser = {
            email: data.email,
            emailVerified: false,
            password: data.password,
            disabled: false
        }

        const userRecord = await admin
            .auth()
            .createUser(newUser);

        const userId = userRecord.uid;

        const claims = {};
        claims[role] = true;

        await admin.auth().setCustomUserClaims(userId, claims);

            await admin.firestore().collection("Collection").doc(userId).collection('private').doc('priv').set({
                act: 0,
                acc: "",
                alt: "",
                lat: "",
                long: "",
                speed: "",
                altAcc: "",
                course: "",
                courseAcc: "",
                time: "",
                devID: ""
            });

        await userCreationRequestRef.update({ status: 'Treated' });
        return { result: 'The new user has been successfully created.' };
    } catch (error) {
        if (error.type === 'UnauthenticatedError') {
            throw new functions.https.HttpsError('unauthenticated', error.message);
        }
    }
});

А ниже вы можете увидеть, как я вызываю ее из моего приложения:

_sendHttpCreateUser = () => {
    var createUser = firebase.app().functions('europe-west1').httpsCallable('createUser');

    const { newUser_email, newUser_password, name, surname, role, phone, personalID, street, city } = this.state;

        var user = {
            email: newUser_email,
            password: newUser_password,
            nam: name,
            personalID: personalID,
            surn: surname,
            tel: phone,
            role: role
        };

    createUser(user)
        .then(function (resp) {
            console.log(resp.data.result);
        })
        .catch(function (error) {
            var code = error.code;
            var message = error.message;
        });
}

Как я уже сказал, единственная ошибка, которую я получаю, - это НЕСАНКЦИОНИРОВАННАЯ, и я гуглил ее и обнаружил, что это означает, что если пользователь не предоставляет правильный токен, то он выдает эту ошибку, однако я предоставляю, так как пользователь, которого я являюсь использование для входа зарегистрировано в облачной консоли Google как администратор. Нужно ли устанавливать этого пользователя в качестве администратора в другом месте? Любое предложение высоко ценится!

...