Firebase功能,获取用于调用其他服务的身份验证令牌

时间:2019-11-01 19:15:20

标签: firebase google-cloud-platform google-cloud-functions google-cloud-run

我正在尝试生成一个身份验证令牌来调用已部署的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函数中调用它的。

编辑:经过一些初步的帮助之后,现在的问题是,当部署到云中时,它可以很好地工作,但是在Firebase函数仿真器中不是本地的。

尝试访问Google Metadata服务器上的任何API / URL都会返回相同的结果:

 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 个答案:

答案 0 :(得分:1)

您的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