Я разрабатываю приложение 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, но я не могу выполнять аутентифицированные вызовы облачных функций.
привет, да, облачная функция предоставила роль «вызов облачных функций» для «allAuthenticatedUsers», вы это имели в виду? Спасибо
Привет, спасибо за помощь, да, меня Cloud Run Invoker
назначили allAuthenticatedUsers
на мой облачный сервис. На стороне клиента у меня есть: ``` const token = await auth.currentUser.getIdToken(); const helloWorld = httpsCallable(functions, 'hello_world', {headers: { Authorization: Bearer ${token}
}}); ```
Попробуйте этот stackoverflow ответ , а также проверьте этот документ, если вы все еще сталкиваетесь с проблемами, поделитесь полными данными журнала
Не могли бы вы поделиться своей конфигурацией для облачной функции и настройки Firebase?
Спасибо за помощь. Я добавил снимок экрана, который, я надеюсь, даст вам больше информации о моей конфигурации функции Cloud и Firebase. Если вам нужна дополнительная информация о чем-то более конкретном, спрашивайте.
Вы прошли этот ответ , вам следует добавить это в свою конфигурацию
Спасибо за помощь. Однако я не уверен, какое отношение это имеет к моей проблеме. Вопрос о переполнении стека и документация, на которую вы ссылаетесь, относятся к вызову облачной функции из Google Workflows
. Я пытаюсь вызвать ему из Firebase. Я не уверен, как и где настроить auth type
, как предложено в принятом решении.
Посмотрите на эту ссылку, это может помочь.
Да, это действительно помогло. Спасибо. Похоже, что для запуска облака необходимо установить значение «Разрешить неаутентифицированные вызовы», а затем управлять аутентификацией с помощью метода Firebase on_call
. Я проверил, и запросы без аутентификации действительно запрещены, поэтому кажется, что он работает должным образом. Спасибо, что указали мне в правильном направлении.
Привет @DarioB, рад слышать, что проблема решена. Публикую это как ответ, чтобы помочь другим участникам, столкнувшимся с подобной проблемой. Не стесняйтесь обновлять, если я что-то пропустил.
Службы Cloud Run по умолчанию развертываются конфиденциально, а это означает, что к ним нельзя получить доступ без предоставления учетных данных для аутентификации в запросе. Эти услуги защищены IAM. По умолчанию службы могут вызывать только владельцы проектов, редакторы проектов, администраторы Cloud Run и инициаторы Cloud Run. Вы можете настроить IAM в службах Cloud Run, чтобы предоставить доступ дополнительным пользователям.
Распространенные случаи использования аутентификации включают в себя:
Разрешение публичного (неаутентифицированного) доступа: разрешены вызовы службы без аутентификации, что делает службу общедоступной.
Чтобы интегрировать Firebase, вам необходимо настроить Cloud Run, чтобы разрешить публичный (без проверки подлинности) доступ. После этого управляйте безопасностью и аутентификацией в Cloud Run/Cloud Functions с помощью вызываемых функций
Можете ли вы попробовать предоставить роль Cloud Run Invoker. Также взгляните на этот документ 1 и документ 2.