我正在尝试使用file.getSignedUrl()通过Google Cloud Functions(Nodejs)从Firebase存储中获取下载URL。我在Cloud Functions控制台中收到此错误:
{ 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/[email protected].
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.json
文件夹中有我的functions
。 firebase deploy
没有给我错误
Error parsing triggers: Cannot find module 'serviceAccountKey.json'
所以我必须有正确的路径到我的serviceAccountKey.json
。我甚至生成了一个新的私钥,但没有解决问题。我有firebase-admin 6.1.0
和firebase-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's answer有不同的代码,但它似乎等同于文档中的代码。
答案与Cloud Identity and Access Management有关。首先,转到您的Google云端平台IAM & admin页面。您将看到各种服务帐户。查找看起来像[email protected]
的服务帐户。它应该在App Engine default service account
专栏中说Name
。 (如果错误消息引用了其他服务帐户,请找到该服务帐户。)
在Role
专栏中,您可能会看到或不看到某些角色。如果您收到SigningError
消息,则Role
列缺少服务帐户令牌创建者角色。选中[email protected]
左侧的复选框以选择服务帐户,然后单击右侧的铅笔进行编辑。在下一个屏幕中,单击+ADD ANOTHER ROLE
。向下滚动到Service Accounts
,选择Service Account Token Creator
,然后保存。现在你应该在Service Account Token Creator
列的Roles
中看到App Engine default service account
。现在您有权创建签名的令牌。
接下来,重复这些步骤并为Storage Object Creator
添加角色。这将允许您运行getSignedURL()
。
您可以另外保存服务帐户管理员和存储管理员,分别包括Service Account Token Creator
和Storage Object Creator
角色以及其他角色。
现在,如果你得到一张SingingError
消息,那可能是因为你在布鲁斯·斯普林斯汀的“光荣日子”格格不入。 :-)
在我的情况下,我启用了身份和访问管理(IAM),网址是以下一个:
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=“你的项目名称”