Как должна быть построена структура для запросов Firebase

Краткая информация: работаю над приложением-викториной для Android. База данных находится на Firebase, и пользователи входят в систему анонимно. Когда пользователь открывает приложение, он автоматически входит в систему.

У меня вопрос о firebase. Я не мог создать интеллект для запросов firebase.

Когда приложение открыто; 1) signInAnonymously (какая функция firebase) должна вызываться первой. 2) Затем я проверяю, есть ли у подписанного пользователя сохраненная точка или нет в базе данных firebase. 3) Если у пользователя нет точки, она генерируется. 4) Затем я отправляю запрос, чтобы понять пользователя.

На всех этапах я отправляю запрос в firebase с помощью асинхронных методов firebase. Последовательность важна, потому что результат любого шага может быть входом для следующего шага.

Я справляюсь с этим с помощью обратного вызова. Но я не знаю, что это лучший способ.

скриншоты обратных вызовов для этих шагов

Вы можете дать мне совет по этому поводу? Если я не использую обратные вызовы, проблемы возникают из-за асинхронных методов firebase. Причина, по которой я открываю этот вопрос, - неопределенные проблемы. Я могу изучить и построить любой другой алгоритм, чтобы сделать его лучше. Спасибо.

Пожалуйста, воздержитесь от использования скриншотов для кода, вы можете просто вставить сам код в свой пост.

Daniel 27.03.2019 13:35
0
1
46
1

Ответы 1

Похоже, вы используете вложенные обратные вызовы, а я не программист на Java, но вы можете расслабиться и не идти по этому пути.

Если я вхожу анонимно, вы имеете в виду процесс аутентификации с использованием одноразового пароля, например, просто предоставление номера телефона, это определенно будет хорошим подходом.

Вы можете использовать Google Cloud Functions, но функции должны быть написаны на Nodejs, Python или Go.

В любом случае взгляните на этот поток ниже:

  1. Пользователь запрашивает OTP
  2. Подтвердите запрос
  3. Сгенерируйте код, сохраните код на бэкэнде (GCF)
  4. Отправьте текст пользователю код
  5. Пользователь отправляет вам правильный код
  6. Сравните коды на сервере
  7. Отправьте пользователю какой-нибудь токен или, как вы говорите, «точку» для его идентификации.

Я действительно считаю, что Java поддерживает веб-токены JSON.

Итак, после вашего установочного проекта GCF вы получите такую ​​папку и файлы:

.firebaserc: скрытый файл, который помогает быстро переключаться между проектами с использованием firebase.

firebase.json: описывает свойства вашего проекта.

functions/: эта папка содержит весь код для ваших функций.

functions/package.json: файл пакета NPM, описывающий ваши облачные функции.

functions/index.js: основной источник кода ваших облачных функций.

functions/node_modules/: папка, в которой установлены все ваши зависимости NPM.

Вы хотите импортировать необходимые модули и инициализировать приложение:

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const serviceAccount = require("./service_account.json");

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

Этот service_account.json - это то, что вам нужно создать, а не библиотеку.

У него будет набор закрытых и открытых ключей, которые вы получите из консоли Firebase. Убедитесь, что вы также поместили этот файл в свои файлы .gitignore.

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

Во-первых, вам нужна идея пользователя, поэтому вам нужно создать пользователя внутри GCF, чтобы он сам по себе был функцией, и, как вы упомянули, Firebase является асинхронным, поэтому он будет выглядеть примерно так:

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

module.exports = function(req, res) {
  // Verify the user provided a phone
  if (!req.body.phone) {
    return res.status(422).send({ error: "Bad Input" });
  }

  // Format the phone number to remove dashes and parens
  const phone = String(req.body.phone).replace(/[^\d]/g, "");

  // Create a new user account using that phone number
  admin
    .auth()
    .createUser({ uid: phone })
    .then(user => res.send(user))
    .catch(err => res.status(422).send({ error: err }));

  // Respond to user request saying account was made
};

Итак, приведенный выше код я взял из своего предыдущего проекта, за исключением того, что все это было на JavaScript. Для вас эта часть будет в частности, в JavaScript или Nodejs, поскольку, опять же, Nodejs, Go или Python - единственные языки, поддерживаемые GCF.

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

Для этого мне пришлось сослаться на объект req.body, как вы видите выше. req.body содержит все различные данные, которые были переданы этой функции, когда пользователь вызвал ее. Я не был уверен, знали ли вы об этом. Итак, прежде чем копировать и вставлять то, что я написал выше, сделайте res.send(req.body);. Так что ничего другого внутри этого module.exports = function(req, res) {}, кроме res.send(req.body);, так что вы можете получить хорошее представление о том, как все это работает.

Для каждой создаваемой функции вам необходимо запустить firebase deploy name-of-project.

После того, как вы почувствуете, что справились с этим и все работает успешно, вы можете создать свой проект Android Studio и добавить зависимость базы данных следующим образом:

compile 'com.google.firebase:firebase-database:10.2.1'

И тогда вы, вероятно, захотите создать свою модель пользователя, может быть, так:

public class User {

    public String phone;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String phone) {
        this.phone = phone;
    }
}

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

Другие вопросы по теме