Вызов облачного запуска из облачной функции: аутентификация IAM

Я развернул небольшую конечную точку HTTP через Google Cloud Run. Когда я выключаю аутентификацию, он работает нормально.

Теперь я хочу включить его, чтобы вызывать его могла только моя облачная функция Firebase. Если я правильно понимаю, мне просто нужно добавить правильный адрес электронной почты учетной записи службы в настройках IAM для Cloud Run as Cloud Run invoker. Но какой адрес правильный?

Я перепробовал все адреса, которые нашел в Firebase Console - ›Настройки проекта -› Учетные записи служб.




Ответы (2)


Я думаю, вы можете проверить конкретную функцию firebase. В пользовательском интерфейсе должна быть указана используемая учетная запись службы.

По умолчанию все функции GCF используют ‹project_id› @ appspot.gserviceaccount.com.

person wlhee    schedule 11.07.2020
comment
Я уже пробовал указанный адрес, но он не работает. Что вы имеете в виду, с помощью которой вы можете проверить конкретную функцию firebase? Где в пользовательском интерфейсе я могу увидеть конкретную учетную запись для него? - person luhu; 11.07.2020
comment
В дополнение к этому обязательно прочтите cloud.google.com/run / docs / authentication / service-to-service, поскольку добавление разрешений к учетной записи службы волшебным образом не сделает ее доступной только для этой функции. Функция должна иметь изменения кода, чтобы добавить токен удостоверения к запросу, который отправляется в Cloud Run. - person Ahmet Alp Balkan; 11.07.2020
comment
этот ответ описывает, как получить учетную запись службы firebase. Затем перейдите по ссылке @ AhmetB-Google. Вы должны явно добавить токен удостоверения в заголовок. Node lib - один из самых простых в использовании! Не стесняйтесь спрашивать, застряли ли вы - person guillaume blaquiere; 11.07.2020

Благодаря @AhmetB - ответ Google и @whlee, у меня все заработало. В принципе, достаточно добавить в запрос токен носителя авторизации, который можно получить из специальной конечной точки: https://cloud.google.com/run/docs/authenticating/service-to-service#nodejs

Затем вам просто нужно добавить сервисный аккаунт функции в список IAM контейнера Cloud Run: ‹project_id› @ appspot.gserviceaccount.com

В примере nodejs используется устаревшая библиотека запросов, поэтому вот моя версия с использованием axios:

    const getOAuthToken = async (receivingServiceURL: string): Promise<string> => {

      // Set up metadata server request
      const metadataServerTokenURL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
      const uri = metadataServerTokenURL + receivingServiceURL;
      const options = {
        headers: {
          'Metadata-Flavor': 'Google'
        }
      };

      return axios.get(uri, options)
        .then((res) => res.data)
        .catch((error) => Promise.reject(error));
    }

Затем вы можете просто использовать токен в фактическом запросе:

    const url = `...`;
    const token = await getOAuthToken(url);

    axios.post(url, formData, {
        headers: {
            Authorization: `Bearer ${token}`,
        }
    }).then(...).catch(...);
person luhu    schedule 02.08.2020