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