Firebase-tools: "Erro: o objeto JSON de entrada não contém um campo client_email" após a atualização para 7.0.2

Criado em 28 jun. 2019  ·  61Comentários  ·  Fonte: firebase/firebase-tools

[OBRIGATÓRIO] Informações do ambiente


firebase-tools: 7.0.2


Plataforma: Oracle Linux Server 7.6, Nó 10.15

[REQUERIDO] Caso de teste


emule a função https com "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[REQUIRED] Passos para reproduzir

execute qualquer função https com funções do firebase

[REQUIRED] Comportamento esperado

sem erros (firebase-tools 7.0.0 não gera erros)

[REQUERIDO] Comportamento real

Pedido enviado para funcionar.

firebase > ⚠  Error: The incoming JSON object does not contain a client_email field
    at JWT.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
    at GoogleAuth.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
    at GoogleAuth.getClient (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
    at GrpcClient._getCredentials (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:107:40)
    at GrpcClient.createStub (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:223:34)
    at new FirestoreClient (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
    at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
    at ClientPool.acquire (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
    at ClientPool.run (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
    at Firestore.request (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:957:33)
⚠  Your function was killed because it raised an unhandled error.
emulator-suite functions bug

Comentários muito úteis

_Aviso: não tenho certeza de como meu problema estava relacionado a este aqui, mas pelo menos posso deixar minhas informações aqui, pois pode ajudar alguns de vocês._

Eu tive o mesmo em uma função firebase que tenta atualizar algum documento no banco de dados Firestore em lote. (Não testei sem lote).

Esta é a pilha de chamadas:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

Eu estava executando minha função localmente usando a linha de comando:
firebase functions:shell

Eu estava usando este código:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
e agora pude chamar minha função localmente usando:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

Consulte os documentos de admin.credential.applicationDefault ()

Todos 61 comentários

@noelmansour obrigado, então parece que algo entre 7.0.1 e 7.0.2 causou isso, irei dar uma olhada nas mudanças feitas.

Também estou enfrentando esse problema desde 7.0.2

Acabei de atualizar para 7.0.2, vendo isso também. Verifiquei as credenciais da minha conta e o campo client_email está presente.

Alguém poderia compartilhar o código de uma função que está tentando executar no emulador que falha com este erro? Quanto mais simples, melhor.

@samtstern O seguinte código falha para mim:

import * as admin from 'firebase-admin';
admin.initializeApp();

import * as functions from 'firebase-functions';

export const testFunction = functions.https.onRequest(async (req, res) => {
  const request = await admin.firestore().doc('test/123').get();

  return request.ref.set({ test: 'random' })
    .then(() => res.send('ok!'))
    .catch((err) => res.status(500).send('error'));
});

Só funciona se eu definir uma conta de serviço ao chamar admin.initializeApp() :

// this works
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

@wceolin obrigado por isso! Você pode executar o seguinte dentro do seu diretório de funções?

$ npm list @google-cloud/firestore

Este é o meu resultado (e tudo funciona para mim):

functions@ /tmp/tmp.ZkMEM0XGPF/functions
└─┬ [email protected]
  └── @google-cloud/[email protected]

Obtive o mesmo resultado: 🤔

Screen Shot 2019-07-01 at 15 44 35

Portanto, estou percorrendo o caminho até o rastreamento de pilha de erros e nesta função:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

Temos esta ramificação:

 async _getCredentials(opts: ClientStubOptions) {
    if (opts.sslCreds) {
      return opts.sslCreds;
    }
    const grpc = this.grpc;
    const sslCreds = grpc.credentials.createSsl();
    const client = await this.auth.getClient();
    const credentials = grpc.credentials.combineChannelCredentials(
      sslCreds,
      grpc.credentials.createFromGoogleCredential(client)
    );
    return credentials;
  }

No meu código opts.sslCreds é definido, então eu acerto este branch:

    if (opts.sslCreds) {
      return opts.sslCreds;
    }

É o outro ramo que tenta reunir credenciais e causa problemas. Agora preciso descobrir por que meu código segue para um lado e o seu para outro.

@wceolin você poderia acessar sua pasta node_modules e editar este arquivo functions/node_modules/google-gax/build/src/grpc.js para ter um console.log() que imprime o objeto options em createStub function e me diga o que você viu?

Obrigado por sua ajuda até agora!

@samtstern Não tenho certeza se isso ajuda, mas fiz vários ajustes em meu package.json e node_modules no fim de semana. Não tenho mais esse problema no 7.0.2.

A saída npm list @google-cloud/firestore corresponde à sua.

Eu destruí meu diretório node_modules no fim de semana, então me pergunto se isso está relacionado.

@noelmansour obrigado por essa nota, explica por que não consigo reproduzir em uma configuração limpa.

@noelmansour Eu também tentei deletar meu node_modules , yarn.lock , removendo dependências, mas não funcionou para mim. Vou tentar criar um projeto do zero para ver o que acontece.

@noelmansour isto é o que obtive do objeto options :

{
  "clientConfig": {},
  "port":443,
  "servicePath":"firestore.googleapis.com",
  "credentials":{},
  "projectId":"my-test-project",
  "firebaseVersion":"8.2.0",
  "libName":"gccl",
  "libVersion":"2.2.3 fire/8.2.0",
  "scopes":[
    "https://www.googleapis.com/auth/cloud-platform", 
    "https://www.googleapis.com/auth/datastore"
  ]
}

@wceolin obrigado, isso é extremamente útil porque é assim que o meu se parece (e como deveria ser):

{
   "clientConfig":{},
   "port":8080,
   "servicePath":"localhost",
   "credentials":{},
   "projectId":"fir-dumpster",
   "firebaseVersion":"8.2.0",
   "libName":"gccl",
   "libVersion":"2.2.3 fire/8.2.0",
   "service":"firestore.googleapis.com",
   "sslCreds":{
      "callCredentials": {}
   },
   "customHeaders":{
      "Authorization":"Bearer owner"
   },
   "scopes":[
      "https://www.googleapis.com/auth/cloud-platform",
      "https://www.googleapis.com/auth/datastore"
   ]
}

Como você pode ver, seu cliente ainda está tentando acessar a produção e depois falha porque o emulador de funções não está autorizado a fazê-lo.

Você também está executando o emulador Firestore? O seu objetivo é gravar no emulador do firestore ou você realmente deseja gravar no firestore de produção?

AH, FINALMENTE CONSEGUI REPRODUZIR ISTO! Se eu executar firebase emulators:start --only functions então tento escrever para o Firestore e obtenho este erro.

Eu vejo esta mensagem de registro:

⚠  The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.

O que não é mais exatamente correto (o erro é sobre client_email), mas a detecção ainda está correta. As outras pessoas aqui também veem esse aviso?

Aqui estão mais algumas informações que podem ajudar. No fim de semana, eu também defini explicitamente a variável env do emulador firestore em meu .zshrc:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Quando o removo, recebo o erro. E isso é com o comando firebase emulators:start

@noelmansour você pode executar esse comando com --debug e anexar os logs aqui como um arquivo txt ?

@samtstern às vezes eu estava usando o emulador para servir uma função HTTP localmente que define alguns dados em produção (geralmente para fazer alguma migração de dados). Estou a usar:

firebase serve --only functions --project myProjectAlias

Não tenho certeza se deveria funcionar assim (permitindo-nos gravar dados para produção), mas costumava funcionar. 😅

@wceolin não deveria funcionar assim com apenas initializeApp() nas versões posteriores a 6.8.0 . Eu também tenho esse caso de uso, mas queremos encontrar uma maneira de fazer essa opção para que o padrão seja proteger a produção.

Mas fico feliz em saber de onde vem esse erro agora!

@samtstern Apenas para confirmar, execute firebase emulators:start --debug com FIRESTORE_EMULATOR_HOST não definido, correto?

Corrigir!

Na segunda-feira, 1º de julho de 2019, 12h28, Noel Mansour [email protected] escreveu:

@samtstern https://github.com/samtstern Apenas para confirmar, execute o firebase
emuladores: start --debug com FIRESTORE_EMULATOR_HOST não definido, correto?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODY7DO2Q#issuecomment-507393898 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

Aqui está.

Para sua informação, removi o ID do projeto desta linha (não acho que isso importa):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

Também vale a pena mencionar que, sem exportar a variável env, [email protected] me dá este erro:

⚠  Error: Getting metadata from plugin failed with error: Header field "authorization" must have only a single value
    at Http2CallStream.call.on (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call.js:68:41)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickCallback (internal/process/next_tick.js:181:9)
⚠  Your function was killed because it raised an unhandled error.

Obrigado @noelmansour por esses logs. Você se importaria de mostrar seu código de funções também?

É um pouco complicado porque prefiro não compartilhar todas as minhas funções e não tenho tempo agora para verificar se isso isoladamente reproduzirá o erro, mas aqui está a função hello que estou executando:

index.ts:

require('./common'); // this should always be first in this file

export * from './debug'
// other exports for other functions

common.ts:

import * as admin from 'firebase-admin';

export const app = admin.initializeApp();

debug.ts:

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import {app} from "./common";

export const hello = functions.https.onRequest(async (req, resp) => {
    const firestore = app.firestore();
    const users = await firestore.collection('users').get();
    console.log('empty users collection? ' + users.empty);
    resp.sendStatus(200);
});

package.json:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "emulators": "npm run build && firebase emulators:start",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@google-cloud/tasks": "^1.1.0",
    "@types/jsonwebtoken": "^8.3.2",
    "@types/request-promise": "^4.1.42",
    "firebase-admin": "^8.2.0",
    "firebase-functions": "^3.0.2",
    "request": "^2.88.0",
    "request-promise": "^4.2.4"
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  },
  "private": true
}

@noelmansour obrigado! Isso acabou de revelar um bug para mim. Essas duas coisas devem ser idênticas, mas não são:

Opção 1

admin.initializeApp();
const firestore = admin.firestore();

opção 2

const app = admin.initializeApp();
const firestore = app.firestore();

Sim, isso consertou para mim. Obrigado!

Também estou tendo o erro Error: The incoming JSON object does not contain a client_email field . Não foi possível consertar.

Código padrão:

import { initializeApp } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();

Outra tentativa:

import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();

Outra tentativa:

import * as admin from 'firebase-admin';

// Initiate Firebase app
export const app = admin.initializeApp();
export const db = admin.firestore();
export const auth = admin.auth();

@JFGHT que comando você está usando para rodar os emuladores? Você pode mostrar o comando e os logs de sua execução com o sinalizador --debug ?

_Aviso: não tenho certeza de como meu problema estava relacionado a este aqui, mas pelo menos posso deixar minhas informações aqui, pois pode ajudar alguns de vocês._

Eu tive o mesmo em uma função firebase que tenta atualizar algum documento no banco de dados Firestore em lote. (Não testei sem lote).

Esta é a pilha de chamadas:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

Eu estava executando minha função localmente usando a linha de comando:
firebase functions:shell

Eu estava usando este código:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
e agora pude chamar minha função localmente usando:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

Consulte os documentos de admin.credential.applicationDefault ()

@samtstern

concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'

Em relação aos logs, não pode ser hoje, sinto muito por isso!

Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Isso funcionou para mim. Estou executando funções localmente via:
firebase serve --only functions

Não está claro para mim se isso é seguro para produção. A partir dos documentos, parece que daria acesso de administrador ao código em execução na produção, mas isso é verdade de qualquer maneira.

@ ralphsmith80 aah você provavelmente está certo:

Encontrar credenciais automaticamente
As bibliotecas de cliente do GCP usam uma estratégia chamada Application Default Credentials (ADC) para encontrar as credenciais do seu aplicativo. Quando seu código usa uma biblioteca cliente, a estratégia verifica suas credenciais na seguinte ordem:

Primeiro, o ADC verifica se a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS está definida. Se a variável for definida, o ADC usará o arquivo de conta de serviço para o qual a variável aponta. A próxima seção descreve como definir a variável de ambiente.

Se a variável de ambiente não for definida, o ADC usará a conta de serviço padrão fornecida pelo Compute Engine, Kubernetes Engine, App Engine e Cloud Functions para aplicativos executados nesses serviços.

Se o ADC não puder usar nenhuma das credenciais acima, ocorrerá um erro.

Essa estratégia é útil ao testar e experimentar, mas pode dificultar saber quais credenciais seu aplicativo está usando.

Fonte: https://cloud.google.com/docs/authentication/production

Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Esse método cria um erro totalmente novo para mim.

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
      at GoogleAuth.getApplicationDefaultAsync (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
     at process._tickCallback (internal/process/next_tick.js:68:7)

Também estou inicializando a loja conforme você declarou em # 1454

admin.initializeApp();
const db = admin.firestore(); 

Com a credencial adicionada a initializeApp , recebo o erro acima.
Sem ele, ainda estou conseguindo;

Error: The incoming JSON object does not contain a client_email field
      at JWT.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
      at GoogleAuth.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
      at GoogleAuth.getClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
      at GrpcClient._getCredentials (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:107:40)
      at GrpcClient.createStub (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:223:34)
      at new FirestoreClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
      at ClientPool.acquire (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
      at ClientPool.run (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
      at Firestore.readStream (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:995:26)

Estou recebendo o mesmo erro em um tutorial básico (o tutorial é de junho de 2019), então esse erro parece muito novo ...

INDEX.JS:

`` `const functions = require ('firebase-functions');
const admin = require ('firebase-admin');
admin.initializeApp ();

admin.firestore()
    .collection('screams')
    .add(newScream)
    .then(doc => {
        res.json({message: `document ${doc.id} created successfully`});
    }) 
    .catch(err => {
        res.status(500).json({ error: 'oops, something went wrong'});
        console.error(err);
    });

});


Quando executo o endpoint no Postman, recebo a mensagem de erro

"erro": "oops, algo deu errado"

Com o console informando:

Funções: Iniciando a execução de "createScream"
Erro: o objeto JSON de entrada não contém um campo client_email

O tutorial é do FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0

Firebase Console> Configurações (ícone de engrenagem)> Usuários e permissões> Contas de serviço

Gere uma nova chave.

Adicione json à pasta do projeto.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

O arquivo json da conta de serviço disponibiliza os serviços e recursos do Firebase para o seu projeto.
Deve ser sempre privado. Incluir arquivo em .gitignore

Firebase Console> Configurações (ícone de engrenagem)> Usuários e permissões> Contas de serviço

Gere uma nova chave.

Adicione json à pasta do projeto.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

O arquivo json da conta de serviço disponibiliza os serviços e recursos do Firebase para o seu projeto.
Deve ser sempre privado. Incluir arquivo em .gitignore


Obrigado phtn, obrigado - segui suas instruções, mas agora recebo o erro

Error: Error occurred while parsing your function triggers.

Estranhamente, quando executo o 'firebase deploy', tudo está funcionando: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - apenas NÃO no localhost?

serviceAccountKey.json deve estar no diretório /functions .

o firebase deploy --only functions reclamará se estiver fora.

Obrigado novamente (por ser tão paciente!). Meu serviceAccountKey.json está na pasta / functions (veja captura de tela no link abaixo).

Parece que há três maneiras de initilizeApp ... Tentei todos os três individualmente e nenhum deles parece funcionar - tenho a sensação de que isso vai ser algo muito simples que estou perdendo.

D

Captura de tela:
Screenshot 2019-07-10 at 09 22 32

Estamos tendo o mesmo problema do nosso lado. Estamos inicializando o Firebase neste modelo:

const firebaseInstance = admin.initializeApp ()
const firestoreInstance = firebaseInstance.firestore ()

Deixe-me saber se podemos fornecer algo para ajudar a rastrear isso.

Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).

Então, continuamos executando:

gcloud auth application-default login

Isso resolveu nosso problema

@ryanhornberger, você pode contornar seu problema fazendo:

const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line

Eu tenho uma correção para isso vindo em # 1459

@samtstern obrigado!

Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).

Então, continuamos executando:

gcloud auth application-default login

Isso resolveu nosso problema

Isso funciona para mim. Eu inicialmente atualizei firebase-tools para 7.1, recebo o 'mesmo erro' quando executo 'firebase serve' em meu local. No entanto, está funcionando bem se eu implantar no firebase. O downgrade para 7.0.1 funciona para mim na minha localidade.

Mesmo problema com 7.1

Estamos trabalhando em uma correção, mas ainda não está pronto:
https://github.com/firebase/firebase-tools/pull/1479

Estou preso com isso, por favor, alguma saída?

o downgrade para 7.0.1 não ajudou para mim

Uma correção para isso foi incorporada ao # 1479 e será incluída na próxima versão (então 7.2.0 )

Ei @samtstern , não tenho certeza se é algo que estou fazendo incorretamente, ou talvez alguns novos problemas, mas notei algumas coisas executando as ferramentas do master mais recente (dad143c42445056014f6f48cc9dfa13156e3c186).

Primeiro, recebo o seguinte aviso ao executar firebase emulators:exec "npm run test" :

⚠ The Cloud Firestore emulator is not running, so calls to Firestore will affect production.

Mesmo que no início do comando, eu possa ver que ele inicia o emulador:

~/d/s/functions ❯❯❯ firebase emulators:exec "npm run test"                                                                                                                           ✘ 130
i  Starting emulators: ["functions","firestore"]
✔  functions: Using node<strong i="12">@8</strong> from host.
✔  functions: Emulator started at http://localhost:5001
i  firestore: Logging to firestore-debug.log
✔  firestore: Emulator started at http://localhost:8080
i  firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080

Na verdade, não está atualizando o banco de dados do firestore de produção. Talvez apenas um falso negativo?

O outro problema é que ainda estou recebendo o erro. Não configurei $GOOGLE_APPLICATION_CREDENTIALS , mas de acordo com https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional já deve haver permissão suficiente para acessar apenas o firestore:

Os gatilhos do Cloud Firestore e do Realtime Database já têm credenciais suficientes e não exigem configuração adicional.

Estou inicializando o SDK do administrador sem nenhum parâmetro usando admin.initializeApp(); Talvez algo esteja fazendo incorretamente?

@noelmansour obrigado por relatar isso (e por tentar master !) Você pode mostrar o código do seu arquivo de funções principais?

Quase com certeza um falso negativo, mas um importante que precisamos corrigir.

É mínimo, pois é apenas exportar de outros arquivos:

import * as admin from 'firebase-admin';

// this should happen before any function runs
admin.initializeApp();

export * from './authFunctions';
export * from './fitbit';
export * from './sleep'
export * from './scheduler';
export * from './debug'
export {scheduleFunction} from "./scheduler";

Na verdade, parece ser um problema com minha configuração de teste. Ao executar firebase emulators:start não vejo o aviso.

@noelmansour como são seus testes? Você também pode registrar um novo problema para discutir isso, para que não enviemos spam para todos neste tópico>

Sim, claro. Me desculpe. # 1530 aberto

Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).
Então, continuamos executando:

gcloud auth application-default login

Isso resolveu nosso problema

Isso funciona para mim. Eu inicialmente atualizei firebase-tools para 7.1, recebo o 'mesmo erro' quando executo 'firebase serve' em meu local. No entanto, está funcionando bem se eu implantar no firebase. O downgrade para 7.0.1 funciona para mim na minha localidade.

Você poderia dizer como fazer o downgrade da versão do Firebase? Minha versão atual é 7.0.2, então eu tentei instalar npm i [email protected] -g isso. mas ainda minha versão é 7.0.2. como fazer o downgrade pls help?

A correção completa para esse problema foi lançada em 7.2.0 :

npm install -g [email protected]

Se você ainda estiver enfrentando um bug semelhante nessa versão, abra um novo problema.

Tendo o mesmo problema com as funções do Firebase. Já tentei npm install -g [email protected] resultando no mesmo erro.

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

Tendo o mesmo problema com as funções do Firebase. Já tentei npm install -g [email protected] resultando no mesmo erro.

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

A seguinte solução funcionou para mim:

// Create Firebase-adminsdk key

// Providing a service account object inline
admin.initializeApp({
    credential: admin.credential.cert({
        projectId: "<PROJECT_ID>",
        clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
        privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
    })
});
Esta página foi útil?
0 / 5 - 0 avaliações