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.
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. :-)
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"