2

Avec l'introduction des fonctions Cloud de Firebase, nous cherchons à déplacer certains de nos codes de serveur node.js vers les fonctions de cloud. Un problème que j'ai est de télécharger un fichier à partir d'un seau GCS dans un fichier temporaire sur le disque, puis de l'envoyer par e-mail en pièce jointe (en utilisant mailgun-js).Firebase cloud function API Erreur avec Google Cloud Storage

Le morceau de code me faisant le deuil est:

return mkdirp(tempLocalDir).then(() => { 
    const bucket = gcs.bucket(gcsBucket); 
    const tempFilePath = tempLocalDir + gcsFile; 
    return bucket.file(gcsFile).download({ 
     destination: tempFilePath 
    }).then(() => { 
     console.log('File downloaded locally to', tempFilePath); 
     var messageSubject = "Test"; 
     var messageBody = "Test with attach"; 

     var mailgunData = { 
      from: , 
      to: agentEmail, 
      subject: messageSubject, 
      html: messageBody, 
      attachment: tempFilePath, 
     }; 
     mailgunAgent.messages().send(mailgunData, function (error, body) { 
      console.log(body); 
     }); 

    }); 

}); 

Le message d'erreur que je reçois dans les journaux des fonctions est:

ApiError: Forbidden 
    at Object.parseHttpRespMessage (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:156:33) 
    at Object.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:131:18) 
    at Duplexify.<anonymous> (/user_code/node_modules/@google-cloud/storage/src/file.js:724:21) 
    at emitOne (events.js:96:13) 
    at Duplexify.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at DestroyableTransform.emit (events.js:188:7) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:188:7) 
    at Request.<anonymous> (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1108:14) 

Je suis été en mesure de télécharger le fichier le dossier/tmp/sur le disque en utilisant request, et ce sera l'option fallback, mais j'aimerais vraiment utiliser les outils GCS si possible. Je "pense" que c'est une erreur d'authentification avec GCS, mais je ne suis pas sûr de savoir comment le faire. Dois-je avoir des paramètres d'authentification différents dans les fonctions de cloud .config() pour GCS que pour Firebase? Si oui, comment les entrer? Notre compartiment et notre projet GCS sont antérieurs à l'introduction de Firebase Storage, mais nous l'avons utilisé avec succès avec les fonctions de noeud exécutées sur notre serveur.

Merci à l'avance, Zach

Répondre

0

Vous devez identifier avant de pouvoir utiliser l'API de stockage cloud Google. Ou toute autre API en passant. Pour ce faire, vous pouvez accéder à la page des connexions de l'API sur la plate-forme google cloud: here et télécharger la clé de compte de service correspondante sous la forme d'un fichier JSON. Ensuite, placez ce fichier dans votre dossier de fonctions dans votre projet Firebase.

Enfin au lieu d'utiliser:
const bucket = gcs.bucket(gcsBucket);

Vous appelleraient ceci:

const gcs = require('@google-cloud/storage'); 

const storageClient = gcs({ projectId: projectId, keyFilename: './keyFilename.json' }); const bucket = storageClient.bucket(gcsBucket);
Avec votre projectId et KeyFileName.

+0

merci pour la réponse. Malheureusement, j'ai essayé, et ça ne marche pas. Je pense que je peux avoir un problème d'autorisation, mais j'ai du mal à le suivre. – Zach

3

Résolu: Finalement résolu ci-dessus. Problème: l'autorisation @ google-cloud/storage nécessitait l'ID de projet GCS comme ID, mais le fichier de clés admin-sdk de Firebase, PAS le fichier de clés du projet GCS. L'utilisation de l'ID de projet Firebase comme ID dans l'authentification pour GCS avec le fichier de clés Firebase a également échoué.

_ (ツ) _/¯

peut-être un comportement étrange que dans notre configuration de projet, mais pensé pertinent de mettre à jour avec ce qui a résolu le problème pour nous.

La configuration qui a fonctionné en utilisant le format fourni par grll ci-dessus est:

const gcs = require('@google-cloud/storage'); 
const storageClient = gcs({ 
    projectId: "this is the GCS project ID, 
    keyFilename: 'this is the firebase admin-sdk keyFilename.json' 
}); 
const bucket = storageClient.bucket(gcsBucket); 
2

Une autre façon de résoudre ce sans y attacher projectId ou KeyFileName:

  1. Aller à la console Firebase de votre projet
  2. Paramètres -> Autorisations
  3. L'onglet IAM doit être ouvert
  4. Maintenant, donnez votre compte de service par défaut App Engine et les autorisations de compte de service Google API pour le rôle de l'administrateur de stockage
  5. Ça devrait aller maintenant!
+0

Impossible de trouver le rôle d'administrateur de stockage. Dois-je créer une nouvelle base pour ce rôle et l'affecter ensuite au compte? De plus, le «compte de service API Google» n'est plus présent. – Xerri