Похоже, вы используете вложенные обратные вызовы, а я не программист на Java, но вы можете не беспокоиться о себе и не идти по этому пути.
Если я вхожу анонимно, вы имеете в виду процедуру аутентификации по одноразовому паролю, например, просто предоставление номера телефона, это, безусловно, будет хорошим подходом.
Вы можете использовать Google Cloud Functions, но функции должны быть написаны на Nodejs, Python или Go.
В любом случае взгляните на этот поток ниже:
- Пользователь запрашивает OTP
- Подтвердить запрос
- Генерация кода, сохранение кода на сервере (GCF)
- текстовый код пользователя
- Пользователь отправляет вам правильный код
- Сравнить коды на сервере
- Отправьте пользователю какой-нибудь токен или, как вы говорите, «точку» для их идентификации.
Я верю, что в 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;
}
}
И так далее, во всяком случае, я надеюсь, что это даст вам достаточно хорошее представление о том, что это поможет вам. Удачи. Я знаю, что не смог найти время, чтобы объяснить, что регулярное выражение в моем коде состоит в очистке номера телефона и, возможно, некоторых других вещей. Итак, еще раз, не просто скопируйте вставить то, что я предложил, изучите это.