我正在使用Google Cloud Node.js存储库将一些图像上传到云存储。这一切都很好。然后,我尝试使用上次上传文件的相同存储对象,在上传文件后立即生成一个签名的URL,但是我收到以下错误消息:
Request had insufficient authentication scopes
我不确定如果所有这些都链接到最初上传的同一服务帐户,为什么会发生这种情况。 (值得的是,它是一个firebase应用程序。)
代码如下:
const Storage = require('@google-cloud/storage');
storage = new Storage();
storage.bucket(bucketName).upload(event.file.pathName, {
// Support for HTTP requests made with `Accept-Encoding: gzip`
gzip: true,
destination: gcsname,
metadata: {
// Enable long-lived HTTP caching headers
// Use only if the contents of the file will never change
// (If the contents will change, use cacheControl: 'no-cache')
cacheControl: 'public, max-age=31536000'
},
}).then(result => {
let url = `https://storage.googleapis.com/${bucketName}/${gcsname}`;
const options = {
action: 'read',
expires: Date.now() + 1000 * 60 * 60, // one hour
};
// Get a signed URL for the file
storage.bucket(bucketName).file(gcsname).getSignedUrl(options).then(result => {
console.log("generated signed url", result);
}).catch(err => {
console.log("err occurred", err)
})
})
存储桶本身不是公共的,对象也不是对象,但是据我了解,我仍然应该能够生成签名的URL。该应用程序本身在GCP计算引擎上运行,因此没有将任何选项传递给new Storage()
-实际上传递选项也会导致上传失败。
有人可以建议我做错了什么吗?
答案 0 :(得分:0)
由于我所拥有的信息量有限,根据收到的错误,您可能会缺少以下几件事:
Compute Engine服务帐户需要iam.serviceAccounts.signBlob权限,该权限可用于“服务帐户令牌创建者”角色。
此外,您可以在此处找到有关该主题的更多文档。
https://cloud.google.com/storage/docs/access-control/signed-urls https://cloud.google.com/storage/docs/access-control/signing-urls-manually