#firebase #flutter #google-cloud-firestore
#firebase #flutter #google-cloud-firestore
Вопрос:
В моем приложении Flutter я решил использовать firebase cloud firestore вместо подхода к базе данных в реальном времени. Мне удалось написать коды для CRUD без выполнения HTTP-запросов. Я пытаюсь понять, как включить идентификатор пользователя и UserToken, созданные при входе пользователя в систему, поскольку у меня нет URL-адреса, используемого в моем коде. Без токена я не могу получать товары из базы данных, учитывая правила, требующие входа пользователя в систему. Пожалуйста, смотрите Мой фрагмент кода ниже для получения данных. Я буду признателен за указание того, как включить авторизацию заголовка с помощью токена в сегмент моментального снимка collections.get() . Я перепробовал все предложения в Интернете, но безуспешно. Спасибо
// var user = FirebaseAuth.instance.currentUser;
try {
final List<Product> loadedProducts = [];
await _firestore
.collection("products")
// .get(headers: {HttpHeaders.authorizationHeader: '$authToken'}).then(
.get()
.then(
(QuerySnapshot snapshot) {
'Authorization: Bearer $authToken';
if (snapshot != null) {
snapshot.docs.forEach(
(f) {
loadedProducts.add(
Product(
id: f.id,
price: f.data()['price'],
title: f.data()['title'],
description: f.data()['description'],
imageUrl: f.data()['imageUrl'],
isFav: f.data()['isFav'],
category: f.data()['category'],
isSelected: f.data()['isSelected'],
),
);
},
);
}
},
);
_items = loadedProducts;
notifyListeners();
} catch (e) {
throw e;
}
}
Ответ №1:
Из вашего вопроса неясно, как вы регистрируете пользователя.
Если вы зарегистрируете пользователя, вызвав Firebase Authentication SDK, то эта информация для входа будет автоматически передана вместе с вызовами базы данных.
Итак: до тех пор, пока ваш get()
вызов Firestore происходит после завершения входа с помощью Firebase Authentication SDK, будет передан токен ID, и request.auth
переменная в ваших правилах безопасности будет отражать это.
Комментарии:
1. Я подписывал пользователя, используя код http-запроса, и проверял, что пользователь вошел в систему, прежде чем перейти к следующему экрану, на котором извлекаются товары из базы данных. Я получаю сообщение об ошибке, что у пользователя / вызывающего абонента нет разрешения на получение данных. Когда я ослабляю правила, которые не должны быть привязаны к авторизованному пользователю, извлекаются данные, подразумевая, что, возможно, bcos idtoken не был включен в запрос. Я знаю, как это сделать для http get, но не для collections.get
2. Выполнение HTTP-запроса может дать вам токен, но вам нужно будет вызвать
signInWith...
метод Firebase для входа этого пользователя в клиент аутентификации, чтобы он передавал токен ID вместе с запросами в Firestore.