SigningError with Firebase getSignedUrl()



我正在尝试使用file.getSignedUrl((通过谷歌云函数(Nodejs(从Firebase Storage获取下载URL。我在云功能控制台中收到这个错误:

{ SigningError: A Forbidden error was returned while attempting to retrieve an access token for the Compute Engine built-in service account. This may be because the Compute Engine instance does not have the correct permission scopes specified. Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/myapp-cd94d/serviceAccounts/myapp-cd94d@appspot.gserviceaccount.com.
at SigningError (/user_code/node_modules/@google-cloud/storage/build/src/file.js:58:9)
at authClient.sign.then.catch.err (/user_code/node_modules/@google-cloud/storage/build/src/file.js:1019:22)
at process._tickDomainCallback (internal/process/next_tick.js:135:7) name: 'SigningError' }

我从Add the Firebase Admin SDK to Your Server文档中复制了代码。我的serviceAccountKey.jsonfunctions文件夹中。firebase deploy没有给我错误

Error parsing triggers: Cannot find module 'serviceAccountKey.json'

所以我必须有正确的路径来访问我的serviceAccountKey.json。我甚至生成了一个新的私钥,但并没有解决问题。我有firebase-admin 6.1.0firebase-tools 6.1.0。以下是我的代码的相关部分:

const admin = require('firebase-admin');
var serviceAccount = require("./myapp-cd94d-firebase-adminsdk-1234x-sEcReT.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://myapp-cd94d.firebaseio.com"
});
...
const config = {
action: 'read',
expires: '03-17-2025'
};
file.getSignedUrl(config).then(function(data) {
const url = data[0];
console.log(url);
})
.catch(function(error) {
console.error(error);
})

我看到Doug Stevenson的答案有不同的代码,但它似乎与文档中的代码等效。

答案与云身份和访问管理有关。首先,转到您的谷歌云平台IAM&管理页面。您将看到各种服务帐户。查找类似myapp-cd99d@appspot.gserviceaccount.com的服务帐户。应该在Name列中显示App Engine default service account。(如果错误消息引用了不同的服务帐户,请查找该服务帐户。(

Role列中,您可能看到也可能看不到某些角色。如果收到SigningError消息,则Role列缺少角色服务帐户令牌创建者。选中myapp-cd99d@appspot.gserviceaccount.com左侧的复选框以选择服务帐户,然后单击右侧的铅笔进行编辑。在下一个屏幕中,单击+ADD ANOTHER ROLE。向下滚动至Service Accounts,选择Service Account Token Creator,然后保存。现在您应该在App Engine default service accountRoles列中看到Service Account Token Creator。现在您有权创建已签名的令牌。

接下来,重复这些步骤并为Storage Object Creator添加一个角色。这将允许您运行getSignedURL()

您可以保存或分配服务帐户管理员和存储管理员,它们分别包括Service Account Token CreatorStorage Object Creator角色以及其他角色。

现在,如果你收到了一条SingingError消息,那可能是因为你唱布鲁斯·斯普林斯汀的《光荣的日子》走调了。:-(

在我的案例中,我启用了身份和访问管理(IAM(,url如下:

https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project="您的项目名称">

相关内容

  • 没有找到相关文章

最新更新