#firebase #google-cloud-firestore
#firebase #google-облако-firestore
Вопрос:
В моем проекте я использую Firestore REST API и использую токены на предъявителя для аутентификации пользователей (применяю правила базы данных). Сейчас я пытаюсь написать тесты E2E для своего приложения, но я не знаю, как генерировать токены. Я попытался сгенерировать их с помощью admin SDK следующим образом:
process.env.FIRESTORE_EMULATOR_HOST = 'localhost:8080';
const db = admin.initializeApp({
projectId: PROJECT_ID,
credential: admin.credential.cert(config.fireStore)
});
const token = await db.auth().createCustomToken(uid);
Но созданный токен не работает (получение PERMISSION_DENIED), что меня не совсем удивляет, потому что учетная запись службы в конфигурации — это учетная запись, загруженная из Firestore (я не уверен, будет ли это работать с эмулятором?)
Я также попытался инициализировать учетные данные admin SDK с помощью: admin.credential.applicationDefault()
но затем я получаю следующую ошибку: Ошибка: не удалось определить учетную запись службы. Обязательно инициализируйте SDK с учетными данными учетной записи службы. В качестве альтернативы укажите учетную запись службы с разрешением iam.ServiceAccounts.signBlob. Исходная ошибка: Ошибка: Ошибка при выполнении запроса: getaddrinfo НЕ НАЙДЕНО метаданных метаданных: 80. Код ошибки: ENOTFOUND
Любая помощь или совет о том, как это сделать, были бы высоко оценены.
Комментарии:
1. Похоже, что эмулятор не использует токены firebase.google.com/docs/emulator-suite /… . В любом случае, при использовании
admin.credential.applicationDefault()
вы настроили переменную среды учетных данных по умолчанию?
Ответ №1:
При вызове db.auth().createCustomToken(uid) вы получаете пользовательский токен аутентификации, подписанный вашей учетной записью службы. Это не токен Firebase ID. Он предназначен для отправки с сервера клиенту (приложению, веб-браузеру и т.д.), А затем этот клиент может вызвать signInWithCustomToken (), чтобы инициализировать сеанс аутентификации на устройстве на основе утверждений, сделанных сервером.
Как только это будет сделано, вы можете получить токен Firebase ID от клиента, используя auth.CurrentUser.getIdToken()
Итак, в основном в вашем тесте вам нужно будет использовать Node.js Admin SDK (firebase-admin) и JS Client SDK (firebase) одновременно для имитации пользовательских сеансов. Это должно быть хорошо, поскольку клиентский SDK может работать в Node.js или среды браузера, но это не очень хорошо освещенный или проверенный путь!
Все, что я упомянул выше, будет работать для тестирования в реальном проекте Firebase. Однако, если вы используете эмулятор, @firebase / testing SDK предоставляет утилиты для имитации аутентификации в тестах. Это генерирует токены, которые принимаются эмулятором Firestore, но не принимаются в производстве. Итак, вы можете сделать:
const testing = require('@firebase/testing');
const testApp = initializeTestApp({
projectId: 'your-project-id',
auth: { uid: 'some-uid' }
});
const testAuth = testApp.auth();
const token = testAuth.currentUser().getIdToken();
Комментарии:
1. @firebase / testing SDK устарел, и его преемники предназначены только для тестирования правил