尝试加载通过以下方式生成的网址时,出现403 SignatureDoesNotMatch错误:
file.getSignedUrl({
expires: moment()
.add(10, 'minutes')
.format()
})
我已经完成了in the example所述的所有步骤,包括将服务帐户令牌创建者添加到App Engine默认服务帐户中,以允许创建签名的网址:
作为通过admin
使用firebase-functions
的替代方法,我尝试下载服务帐户凭据service-account-credentials.json
并按照建议的here创建gcs存储对象,如下所示:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage({
keyFilename: 'service-account-credentials.json',
projectId: 'project-id',
});
storage.bucket('bucket-id').getFiles({prefix: 'path/to/dir'}).then(files => files.map(file => [same code as above]));
但是,这仍然会生成SignatureDoesNotMatch网址。
我已遵循与此问题相关的github issue,但未能找到可行的解决方案。使用iam.signBlobRequest
的{{3}}引用,但我不知道iam
的定义,我只将The solution listed by Firebase dev owner @mcdonamp in the issue视为bucket
的属性,没有{{ 1}}方法,以及here作为HTTP API端点。
答案 0 :(得分:1)
看来,尽管Content-Type
中的the doc's claim标头是可选的,但并非如此。根据{{3}}和this SO post的建议,在contentType
选项参数中添加getSignedUrl
可以解决此问题:
file.getSignedUrl({
action: 'read',
contentType: 'audio/wav',
expires: moment()
.add(10, 'minutes')
.format()
})
确保在请求资源时也包括标头。