Краткий ответ: Весь наш подход к набору правил Firebase RealtimeDB был неверным с самого начала;мы выполнили правила без понимания Firebase Auth и его связи с RealtimeDB.У нас были настройки, правила основанные только на uid и RealtimeDB, сохраняющие некоторый случайный токен в RealtimeDB, надеясь, что мы сможем каким-то образом передать токен на auth payload пользователю.
Длинный ответ: Как указано в собственной базе данных Firebase Документы по безопасности баз данных Правила базы данных напрямую используют аутентификацию Firebase.
С этого момента реализована настраиваемая аутентификация с Аутентификация RNFirebase.io
клиентская сторона:
let postLogin = (userCredentials) => {
db = firebase.database();
//...do stuff
}
firebase
.auth()
.signInAndRetrieveDataWithCustomToken(token)
.then(postLogin);
консоль firebase:
Project Settings -> Service Accounts -> Generate new private key.
, которая генерирует закрытый ключ firebase в формате json и некоторые значения идентификаторов.Импортируйте это в любую библиотеку, которую вы используете на стороне сервера, в нашем случае kreait / firebase-php
Не не разрешают анонимную аутентификацию, что может нанести ущерб цели.
php с использованием kreait / firebase.php:
use Kreait\Firebase\Factory;
use Kreait\Firebase\ServiceAccount;
$serviceAccount = ServiceAccount::fromJsonFile($pathToJson);
$firebase = (new Factory())
->withServiceAccount($serviceAccount)
->create();
$token = (string) $firebase->getAuth()->createCustomToken($uid, $payload)
Мне не нужно было знать о полезной нагрузке на стороне клиента.Он передается через клиентскую часть в подписанном JWToken.