web-dev-qa-db-ja.com

Firebase getSignedUrl()でのSigningError

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.jsonfunctionsフォルダにあります。 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の回答 には異なるコードがあることがわかりましたが、ドキュメントのコードと同等のようです。

19

答えは 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メッセージを受け取った場合は、ブルーススプリングスティーンの「グローリーデイズ」を調子が狂っているからかもしれません。 :-)

43

私の場合、Identity and Access Management(IAM)を有効にしていました。URLは次のとおりです。

https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project= "YOUR PROJECT NAME"

0
Pol Fernández