Невозможно пройти аутентификацию с помощью эмулятора Firestore

#node.js #firebase #google-cloud-firestore

#node.js #firebase #google-облако-firestore

Вопрос:

Я использую Firebase admin с Node Express для обновления документов Firestore из Appengine. У меня есть несколько тестов, которые я хочу провести с помощью эмулятора Firestore. Вот ошибка, которую я получаю:

 Error in post /requests Error: {"servicePath":"localhost","port":8080,
"clientConfig":{},"fallback":true,"sslCreds":{"callCredentials":{}},
"projectId":"test-project","firebaseVersion":"9.4.1","libName":"gccl",
"libVersion":"4.7.1 fire/9.4.1","ssl":false,
"customHeaders":{"Authorization":"Bearer owner"},"scopes":[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/datastore"
]}
You need to pass auth instance to use gRPC-fallback client in browser. Use OAuth2Client from google-auth-library.
  

Перед каждым тестом я звоню:

 var serviceAccount = require(process.env.FIREBASE_SA_CREDENTIAL);
firebaseAdmin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    projectId: 'test-project'
});
  

И в тесте используется класс, который просто обращается к Firestore следующим образом:

 this.db = firebaseAdmin.firestore();
...
  

У меня есть следующие зависимости от npm:

 "@google-cloud/firestore": "^4.7.1",
"firebase": "^8.0.2",
"firebase-admin": "^9.4.1"
"firebase-tools": "^8.16.2"
  

Я запускаю эмуляторы и запускаю тесты с:

 firebase emulators:exec 'jest --verbose=false'
  

Я не вижу, что неверно в конфигурации — насколько я вижу, эмулятор должен принимать все аутентификации. Сообщение об ошибке предполагает, что он использует некоторую интерфейсную библиотеку, а не серверную библиотеку, но все зависимости кажутся правильными.

Комментарии:

1. Из любопытства, используете ли вы рендеринг на стороне сервера? Я обнаружил, что у меня возникла эта проблема, и когда я удалил функцию SSR, я смог запустить ее, как ожидалось.

Ответ №1:

Хорошо, решено. В конфигурации jest отсутствовала важная строка:

 module.exports = {
  testEnvironment: 'node'
}
  

Тестовая среда: ‘узел’. Это вызывало некоторое поведение в библиотеках Firebase, которое заставляло их думать, что среда была браузером.