我有一个Google Cloud Function,可以在添加新图像时触发。它调整图像的大小,然后将其URL添加到数据库。我的目标是生成一个绝对URL,以便可以查看存储中所有图像的所有URL。
曾经有一种叫做getDownloadUrl
的方法,但是Firebase在今年改变了很多东西,而我所知道的已经不存在了。我知道的唯一替代方法是getSignedUrl
。
因此,我尝试实现此功能,但是在功能日志中出现错误:
错误:{SigningError:权限iam.serviceAccounts.signBlob需要在服务帐户项目/my-little-app/serviceAccounts/my-little-app@appspot.gserviceaccount.com上执行此操作。
在/user_code/node_modules/firebase-admin/node_modules/@google-cloud/storage/src/file.js:1784:16
在Request._callback(/user_code/node_modules/firebase-admin/node_modules/google-auto-auth/index.js:362:9)
在Request.self.callback(/user_code/node_modules/firebase-admin/node_modules/request/request.js:185:22)
takeTwo(events.js:106:13)
在Request.emit(events.js:191:7)
根据要求。 (/user_code/node_modules/firebase-admin/node_modules/request/request.js:1161:10)
在emitOne(events.js:96:13)
在Request.emit(events.js:188:7)
在IncomingMessage。 (/user_code/node_modules/firebase-admin/node_modules/request/request.js:1083:12)
在IncomingMessage.g(events.js:292:16)
消息:“在服务帐户项目/my-little-app/serviceAccounts/my-little-app@appspot.gserviceaccount.com上执行此操作需要iam.serviceAccounts.signBlob权限。” }
我的代码如下:
let config = {
action: 'read',
expires: '12-31-2025'
};
await bucket
.file(finalFileName)
.getSignedUrl(config)
.then(results => {
const url = results[0];
db.collection('images').add({
name: finalFileName,
path: finalFilePath,
url: url
});
console.log(`The signed url for ${finalFileName} is ${url}.`);
})
.catch(err => {
console.error('ERROR: ', err);
});
经过研究,我发现应该向位于https://console.cloud.google.com/iam-admin/iam的服务帐户添加 “云功能服务代理” 。但是,它已经在那里列出。
供参考,在使用此getSignedUrl
时,我一直在使用以下文档:https://cloud.google.com/nodejs/docs/reference/storage/2.0.x/File#getSignedUrl。在其中指出:
在诸如Cloud Functions和App Engine之类的Google Cloud Platform环境中,您通常在实例化过程中不提供keyFilename或凭据。在这些环境中,我们调用signBlob API [*]创建一个签名URL。该API需要https://www.googleapis.com/auth/iam或https://www.googleapis.com/auth/cloud-platform范围,因此请确保已启用它们。
[* signBlob API:https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/signBlob#authorization-scopes]
而且,如果您单击上面的 googleapis.com 链接,您会发现它们不起作用。 -.-我完全不知道如何在存储中获取文件的简单url。应该不是那么复杂,有什么想法吗?谢谢。