Аутентификация Firebase с помощью облачных функций не удалась: «Запрос не был аутентифицирован»

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


1
112
1

Ответ:

Решено

Службы Cloud Run по умолчанию развертываются конфиденциально, а это означает, что к ним нельзя получить доступ без предоставления учетных данных для аутентификации в запросе. Эти услуги защищены IAM. По умолчанию службы могут вызывать только владельцы проектов, редакторы проектов, администраторы Cloud Run и инициаторы Cloud Run. Вы можете настроить IAM в службах Cloud Run, чтобы предоставить доступ дополнительным пользователям.

Распространенные случаи использования аутентификации включают в себя:

Разрешение публичного (неаутентифицированного) доступа: разрешены вызовы службы без аутентификации, что делает службу общедоступной.

Чтобы интегрировать Firebase, вам необходимо настроить Cloud Run, чтобы разрешить публичный (без проверки подлинности) доступ. После этого управляйте безопасностью и аутентификацией в Cloud Run/Cloud Functions с помощью вызываемых функций