Аутентификация 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, но я не могу выполнять аутентифицированные вызовы облачных функций.

Можете ли вы попробовать предоставить роль Cloud Run Invoker. Также взгляните на этот документ 1 и документ 2.

Sathi Aiswarya 08.07.2024 16:04

привет, да, облачная функция предоставила роль «вызов облачных функций» для «allAuthenticatedUsers», вы это имели в виду? Спасибо

DarioB 08.07.2024 16:25
Cloud Run Invoker, также попробуйте обновить функции firebase
Sathi Aiswarya 08.07.2024 17:02

Привет, спасибо за помощь, да, меня Cloud Run Invoker назначили allAuthenticatedUsers на мой облачный сервис. На стороне клиента у меня есть: ``` const token = await auth.currentUser.getIdToken(); const helloWorld = httpsCallable(functions, 'hello_world', {headers: { Authorization: Bearer ${token}}}); ```

DarioB 08.07.2024 17:40

Попробуйте этот stackoverflow ответ , а также проверьте этот документ, если вы все еще сталкиваетесь с проблемами, поделитесь полными данными журнала

Sathi Aiswarya 10.07.2024 09:58

Не могли бы вы поделиться своей конфигурацией для облачной функции и настройки Firebase?

Sathi Aiswarya 11.07.2024 13:25

Спасибо за помощь. Я добавил снимок экрана, который, я надеюсь, даст вам больше информации о моей конфигурации функции Cloud и Firebase. Если вам нужна дополнительная информация о чем-то более конкретном, спрашивайте.

DarioB 16.07.2024 15:19

Вы прошли этот ответ , вам следует добавить это в свою конфигурацию

Sathi Aiswarya 17.07.2024 21:36

Спасибо за помощь. Однако я не уверен, какое отношение это имеет к моей проблеме. Вопрос о переполнении стека и документация, на которую вы ссылаетесь, относятся к вызову облачной функции из Google Workflows. Я пытаюсь вызвать ему из Firebase. Я не уверен, как и где настроить auth type, как предложено в принятом решении.

DarioB 19.07.2024 09:46

Посмотрите на эту ссылку, это может помочь.

Sathi Aiswarya 19.07.2024 21:11

Да, это действительно помогло. Спасибо. Похоже, что для запуска облака необходимо установить значение «Разрешить неаутентифицированные вызовы», а затем управлять аутентификацией с помощью метода Firebase on_call. Я проверил, и запросы без аутентификации действительно запрещены, поэтому кажется, что он работает должным образом. Спасибо, что указали мне в правильном направлении.

DarioB 23.07.2024 16:58

Привет @DarioB, рад слышать, что проблема решена. Публикую это как ответ, чтобы помочь другим участникам, столкнувшимся с подобной проблемой. Не стесняйтесь обновлять, если я что-то пропустил.

Sathi Aiswarya 26.07.2024 08:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме