firebase - 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
但情况并非如此,因为它在部署时工作正常。
我正在使用我的主服务帐户密钥,它对整个项目具有所有者权限。
解决方案
您的 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
。
推荐阅读
- python - Tkinter Python 打印用户输入
- python-3.x - 如何将相同的输入存储在不同的位置,并为每次增加 1 的每个答案设置不同的名称?像,name1,name2 等
- database - 弱实体的 UML 图和多重性
- javascript - 获取 Express API/Mongoose 调用后承诺不触发 .then()
- r - 如何在不使用循环的情况下生成以下时间序列?
- node.js - 带有 openDirectory 的 showSaveDialogSync 在 Electron 中打开文件选择器
- c# - 测试方法访问错误的表?
- python - 快速文本类型错误:():不兼容的函数参数
- android - 在android中启动有关画中画模式的设置
- abap - SAP ABAP 循环内循环到 7.40 语法