Как должна быть построена структура для запросов Firebase - PullRequest
0 голосов
/ 17 мая 2018

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

Мой вопрос о пожарной базе.Я не мог собрать разведданные для запросов на пожарную базу.

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

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

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

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

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

1 Ответ

0 голосов
/ 27 марта 2019

Похоже, вы используете вложенные обратные вызовы, а я не программист на 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'

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

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;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...