Я развернул в 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 как администратор. Нужно ли устанавливать этого пользователя в качестве администратора в другом месте? Любое предложение высоко ценится!