Я разрабатываю приложение React, которое должно вызывать функцию Python Google Cloud get2, защищенную аутентификацией Firebase. Однако, когда я пытаюсь вызвать облачную функцию, я получаю сообщение об ошибке: «Запрос не был аутентифицирован. Либо разрешите неаутентифицированные вызовы, либо установите правильный заголовок авторизации».
Если я разрешаю вызовы без аутентификации, все работает нормально, но я бы хотел, чтобы только аутентифицированные пользователи могли вызывать облачную функцию.
Облачной функции назначена роль Cloud Functions Invoker
для allAuthenticatedUsers
и в облаке (потому что это gen2) на вкладке безопасности, которую я выбрал Require authentication
.
Вот фрагмент моего компонента реагирования:
const callCloudFunction = async () => {
try {
if (!auth.currentUser) {
throw new Error("User not authenticated");
}
const helloWorld = httpsCallable(functions, 'hello_world');
const response = await helloWorld();
console.info(response.data);
setResult(response.data);
} catch (error) {
console.error("Error calling Cloud Function:", error);
setError(error.message || error.toString());
}
};
Я также попытался добавить идентификатор токена следующим образом:
// Get the ID token
const token = await auth.currentUser.getIdToken();
const helloWorld = httpsCallable(functions, 'hello_world', {
// Include the Authorization header with the bearer token
headers: {
Authorization: `Bearer ${token}`
}
});
Но безуспешно. Заранее спасибо.
Обновлено: Вот некоторая дополнительная информация о настройке облачной функции/облака и Firebase:
Разрешения на запуск в облаке: (Запуск в облаке -> выберите сервис -> Разрешения)
Аутентификация безопасности при запуске в облаке: (Запуск в облаке -> нажмите на сервис -> вкладка «Безопасность»)
Разрешения облачных функций: (Облачные функции -> выберите облачную функцию -> Разрешения)
Таким образом, если я изменю Аутентификацию безопасности запуска облака на «Разрешить вызовы без аутентификации», все пойдет нормально, но, вероятно, это связано с тем, что аутентификация отсутствует, а функция облака является общедоступной. Однако, с другой стороны, если я оставлю параметр «Требовать аутентификацию», я увижу это в журналах запуска облака:
В Firebase включен метод аутентификации — электронная почта/пароль, и в настоящее время существует один созданный пользователь. Я могу нормально войти в систему с аутентификацией Firebase, но я не могу выполнять аутентифицированные вызовы облачных функций.
🤔 А знаете ли вы, что...
Node.js активно использует асинхронное программирование и обратные вызовы для обработки многозадачности.
Службы Cloud Run по умолчанию развертываются конфиденциально, а это означает, что к ним нельзя получить доступ без предоставления учетных данных для аутентификации в запросе. Эти услуги защищены IAM. По умолчанию службы могут вызывать только владельцы проектов, редакторы проектов, администраторы Cloud Run и инициаторы Cloud Run. Вы можете настроить IAM в службах Cloud Run, чтобы предоставить доступ дополнительным пользователям.
Распространенные случаи использования аутентификации включают в себя:
Разрешение публичного (неаутентифицированного) доступа: разрешены вызовы службы без аутентификации, что делает службу общедоступной.
Чтобы интегрировать Firebase, вам необходимо настроить Cloud Run, чтобы разрешить публичный (без проверки подлинности) доступ. После этого управляйте безопасностью и аутентификацией в Cloud Run/Cloud Functions с помощью вызываемых функций