file.getSignedUrl() を使用して、Google Cloud Functions(Nodejs)経由でFirebase Storageからダウンロード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' }
Firebase Admin SDKをサーバーに追加 ドキュメントからコードをコピーしました。私は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の回答 には異なるコードがあることがわかりましたが、ドキュメントのコードと同等のようです。
答えは Cloud Identity and Access Management に関係しています。まず、Google Cloud Platform IAM&admin ページに移動します。さまざまなサービスアカウントが表示されます。 _[email protected]
_のようなサービスアカウントを探します。 Name
列に_App Engine default service account
_と表示されているはずです。 (エラーメッセージが別のサービスアカウントを参照している場合は、そのサービスアカウントを見つけます)。
Role
列には、一部の役割が表示される場合と表示されない場合があります。 SigningError
メッセージが表示される場合、Role
列には役割Service Account Token Creatorがありません。 _[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
メッセージを受け取った場合は、ブルーススプリングスティーンの「グローリーデイズ」を調子が狂っているからかもしれません。 :-)
私の場合、Identity and Access Management(IAM)を有効にしていました。URLは次のとおりです。
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project= "YOUR PROJECT NAME"