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

Firebase functions, getting a authentication token for calling another service

我正在尝试生成一个授权令牌来调用已部署的云 运行 服务,下面是我调用元数据服务器的代码:

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 元数据服务器上的任何 API / URL returns 结果相同:

 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 但事实并非如此,因为它在部署时工作正常。

我正在使用我的主服务帐户密钥,它拥有整个项目的所有者权限。

您的 URI 格式不正确:

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

不要忘记为 AUDIENCE 指定一个值,它将成为 Cloud 运行 服务端点。

Cloud Function 还需要一个具有访问元数据服务器权限的服务。

默认情况下,Cloud Functions 使用以下服务帐户:

PROJECT_ID@appspot.gserviceaccount.com

此服务帐户默认具有 Editor 角色。这授予了大量权限。默认服务帐户也可以更改为不同的服务帐户。访问元数据服务器的最低要求是权限 compute.instances.get.