Google-Firebase Cloud功能-向数据库添加图像URL(getSignedUrl签名错误)

时间:2018-11-12 04:46:32

标签: javascript node.js firebase firebase-realtime-database google-cloud-platform

我有一个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/iamhttps://www.googleapis.com/auth/cloud-platform范围,因此请确保已启用它们。

[* signBlob API:https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/signBlob#authorization-scopes]

而且,如果您单击上面的 googleapis.com 链接,您会发现它们不起作用。 -.-我完全不知道如何在存储中获取文件的简单url。应该不是那么复杂,有什么想法吗?谢谢。

编辑:找到解决方案 https://stackoverflow.com/a/50138883/2719598

0 个答案:

没有答案