web-dev-qa-db-fra.com

SigningError avec Firebase getSignedUrl ()

J'essaie d'utiliser file.getSignedUrl () pour obtenir l'URL de téléchargement à partir de Firebase Storage via Google Cloud Functions (Nodejs). Je reçois cette erreur dans la console 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' }

J'ai copié le code de la documentation Ajouter le SDK Firebase Admin à votre serveur . J'ai mon serviceAccountKey.json dans mon dossier functions. firebase deploy ne me donne pas l'erreur

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

donc je dois avoir le bon chemin vers mon serviceAccountKey.json. J'ai même généré une nouvelle clé privée, qui n'a pas résolu le problème. J'ai firebase-admin 6.1.0 et firebase-tools 6.1.0. Voici les parties pertinentes de mon code:

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);
  })

J'ai vu que réponse de Doug Stevenson a un code différent mais il semble être équivalent au code dans la documentation.

12
Thomas David Kehoe

La réponse a à voir avec Cloud Identity and Access Management . Tout d'abord, accédez à votre page Google Cloud Platform IAM et admin . Vous verrez divers comptes de service . Recherchez le compte de service qui ressemble à [email protected]. Il doit indiquer App Engine default service account Dans la colonne Name. (Si un message d'erreur faisait référence à un autre compte de service, recherchez ce compte de service.)

Dans la colonne Role, vous pouvez voir ou non certains rôles. Si vous recevez un message SigningError, la colonne Role ne contient pas le rôle Créateur de jeton de compte de service . Cochez la case à gauche de [email protected] Pour sélectionner le compte de service, puis cliquez sur le crayon à droite pour le modifier. Dans l'écran suivant, cliquez sur +ADD ANOTHER ROLE. Faites défiler jusqu'à Service Accounts, Sélectionnez Service Account Token Creator Et enregistrez. Vous devriez maintenant voir Service Account Token Creator Dans la colonne Roles pour App Engine default service account. Vous avez maintenant la permission de créer des jetons signés.

Ensuite, répétez ces étapes et ajoutez un rôle pour Storage Object Creator. Cela vous permettra d'exécuter getSignedURL().

Vous pouvez enregistrer également affecter l'administrateur du compte de service et l'administrateur du stockage, qui incluent respectivement les rôles Service Account Token Creator Et Storage Object Creator, Ainsi que d'autres rôles.

Maintenant, si vous avez plutôt un message SingingError, c'est peut-être parce que vous déformez les "Glory Days" de Bruce Springsteen. :-)

43
Thomas David Kehoe

Dans mon cas, j'avais activé la gestion des identités et des accès (IAM), l'url est la suivante:

https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project= "VOTRE NOM DE PROJET"

0
Pol Fernández