Функции Firebase, получение токена аутентификации для вызова другого сервиса - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь сгенерировать токен авторизации для вызова развернутой службы Cloud Run, ниже, если мой код вызывается на сервер метаданных:

async function auth(receivingServiceURL:string) {
  const metadataTokenURL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
  const options ={
    headers: {
      'Metadata-Flavor': 'Google',
    },
  }
  const response = await fetch(metadataTokenURL + receivingServiceURL, options);
  return response;
}

Моя ошибка выглядит следующим образом:


>      at ClientRequest.<anonymous> (/Users/dennisy/dev/view/functions/node_modules/node-fetch/lib/index.js:1455:11)
>      at ClientRequest.emit (events.js:210:5)
>      at Socket.socketErrorListener (_http_client.js:406:9)
>      at Socket.emit (events.js:210:5)
>      at emitErrorNT (internal/streams/destroy.js:92:8)
>      at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
>      at processTicksAndRejections (internal/process/task_queues.js:80:21) {
>    message: 'request to http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://universal-sentence-encoder-lite-xnqffnl2ba-ew.a.run.app failed, reason: getaddrinfo ENOTFOUND metadata',
>    type: 'system',
>    errno: 'ENOTFOUND',
>    code: 'ENOTFOUND'
>  }

Я звоню из функции firebase.

EDIT: после некоторой начальной помощи проблема заключается в том, что это работает нормально при развертывании в облаке, но не локально из эмулятора функций firebase.

Попытка получить доступ к любому API / URL на сервере метаданных Google возвращает тот же результат:

 FetchError: request to http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://universal-sentence-encoder-lite-xnqffnl2ba-ew.a.run.app failed, reason: getaddrinfo ENOTFOUND metadata.google.internal

Похоже, что ресурс не найден reason: getaddrinfo ENOTFOUND metadata.google.internal, но это не такпри развертывании он работает нормально.

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

1 Ответ

1 голос
/ 01 ноября 2019

У вас неправильный URI:

http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE

Не забудьте указать значение для AUDIENCE, которое будет конечной точкой службы Cloud Run.

Для облачной функции также требуетсяслужба с разрешениями на доступ к серверу метаданных.

По умолчанию Cloud Functions использует следующую учетную запись службы:

PROJECT_ID@appspot.gserviceaccount.com

Эта учетная запись службы по умолчанию имеет роль Editor. Это дает огромное количество разрешений. Учетная запись службы по умолчанию также может быть изменена на другую учетную запись службы. Минимальным требованием для доступа к серверу метаданных является разрешение compute.instances.get.

...