В функциях firebase: оболочка, ошибка: получение метаданных из плагина не удалось с ошибкой: invalid_grant

Я использую Firebase 7.0.0. При использовании firebase functions:shell я получаю следующую ошибку всякий раз, когда пытаюсь get() документ или listDocuments() в коллекции без дополнительной информации: «Ошибка: получение метаданных из плагина не удалось с ошибкой: invalid_grant». Обратите внимание, что все работает нормально, когда один и тот же код развертывается в Firebase Cloud Functions.

import * as functions from 'firebase-functions'
import * as firebase from 'firebase-admin'
try { firebase.initializeApp() } catch ( error ) { }


exports = module.exports = functions.https.onRequest(
        async ( request: functions.https.Request, response: functions.Response ) => {
            if ( request.method === 'POST' ) {
                await firebase.firestore().collection( `users` )
                    .listDocuments()
                    .then( ( documents: FirebaseFirestore.DocumentReference[] ) => {
                            for ( const document of documents ) {
                                console.log( `Found ${document.id}`)
                            }
                            response.status( 200 ).end()
                        }
                    )
                    .catch( ( error: any ) => {
                            console.error( `List failed: ${error}` )
                            response.status( 405 ).end()
                        }
                    )
            }
            else {
                console.error( `Unexpected ${request.method}` )          
            }
        }
    )

Что я делаю неправильно?


person Gary Hooper    schedule 14.07.2019    source источник
comment
Я не вижу в вашем коде, где вы фактически определили функцию для развертывания или эмуляции с помощью firebase-functions SDK.   -  person Doug Stevenson    schedule 15.07.2019
comment
Это был отрывок. Я обновил его, чтобы он содержал весь блок кода, который был успешно развернут в Firebase Cloud Functions.   -  person Gary Hooper    schedule 15.07.2019


Ответы (1)


У меня такая же ошибка. «Ошибка: 400 undefined: не удалось получить метаданные из подключаемого модуля с ошибкой: invalid_grant».

в моем случае проблема была в firebase.initializeApp ()

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Когда я делал только один проект, проблем не было, но это начало происходить, когда я попробовал протестировать 2 проекта функций firebase. Параметр admin.credential.applicationDefault () предназначен только для одной конфигурации проекта, поэтому будет работать только один проект, а другие не будут работать, если у вас есть более двух проектов функций firebase с этим параметром.

Итак, чтобы решить эту проблему

  1. В консоли Firebase откройте «Настройки»> «Учетные записи служб».

  2. Нажмите «Создать новый закрытый ключ», затем подтвердите, нажав «Сгенерировать ключ».

  3. Надежно храните файл JSON, содержащий ключ.

При авторизации через учетную запись службы у вас есть два варианта предоставления учетных данных вашему приложению. Вы можете установить переменную среды GOOGLE_APPLICATION_CREDENTIALS или явно передать путь к ключу учетной записи службы в коде. Первый вариант более безопасен и настоятельно рекомендуется.

Чтобы установить переменную среды:

Задайте для переменной среды GOOGLE_APPLICATION_CREDENTIALS путь к файлу JSON, который содержит ключ вашей учетной записи службы. Эта переменная применяется только к вашему текущему сеансу оболочки, поэтому, если вы открываете новый сеанс, установите переменную снова.

Linux или macOS

экспорт GOOGLE_APPLICATION_CREDENTIALS = "/ home / user / Downloads / service-account-file.json"

окна с PowerShell:

$ env: GOOGLE_APPLICATION_CREDENTIALS = "C: \ Users \ username \ Downloads \ service-account-file.json"

если вы хотите передать путь к ключу учетной записи службы в коде.

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

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

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

https://firebase.google.com/docs/admin/setup?authuser=0 - это официальная ссылка на документ о добавлении Firebase Admin SDK на сервер.


Надеюсь, это кому-то поможет.

person Yang    schedule 25.10.2019