Google Cloud Cloud Function签名网址产生403 SignatureDoesNotMatch

时间:2019-01-16 21:29:23

标签: firebase google-cloud-platform google-cloud-storage google-cloud-functions firebase-storage

尝试加载通过以下方式生成的网址时,出现403 SignatureDoesNotMatch错误:

file.getSignedUrl({
  expires: moment()
    .add(10, 'minutes')
    .format()
})

我已经完成了in the example所述的所有步骤,包括将服务帐户令牌创建者添加到App Engine默认服务帐户中,以允许创建签名的网址:

enter image description here


作为通过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端点。

1 个答案:

答案 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()
})

确保在请求资源时也包括标头。