Вызов Cloud Run из облачной функции: аутентификация IAM - PullRequest
1 голос
/ 11 июля 2020

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

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

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

Ответы [ 2 ]

3 голосов
/ 11 июля 2020

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

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

0 голосов
/ 02 августа 2020

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

Затем вам просто нужно добавить служебную учетную запись функции в список IAM контейнера Cloud Run: @ appspot.gserviceaccount.com

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

    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(...);
...