首页 > 解决方案 > Firebase 函数,获取用于调用另一个服务的身份验证令牌

问题描述

如果我的代码调用元数据服务器,我正在尝试生成一个身份验证令牌来调用已部署的 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 元数据服务器上的任何 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但情况并非如此,因为它在部署时工作正常。

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

标签: firebasegoogle-cloud-platformgoogle-cloud-functionsgoogle-cloud-run

解决方案


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


推荐阅读