Firebase в Java: серверный Admin SDK и Realtime Database
В Java важно различать Firebase Admin SDK для доверенного сервера и Firebase Android SDK для клиентского приложения. Admin SDK даёт привилегированный доступ, поэтому его служебные credentials нельзя встраивать в APK, веб-страницу или публичный репозиторий. Ниже рассматривается именно серверная Java.
Подключить зависимость и credentials
В официальном примере подключения используется такая Gradle-зависимость. Перед внедрением сверяйте совместимость SDK и JDK вашего проекта:
dependencies {
implementation 'com.google.firebase:firebase-admin:9.11.0'
}Инициализируйте приложение через Application Default Credentials. В управляемой среде это может быть назначенная сервисная identity; локально credentials настраиваются отдельно и хранятся вне исходников. В FIREBASE_DATABASE_URL задайте точный URL своей Realtime Database: регион и имя экземпляра нельзя угадывать по названию проекта.
Записать тестовое значение и получить подтверждение
Пример использует String.isBlank, поэтому требует Java 11 или новее, а также подключённый Admin SDK.
import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.concurrent.TimeUnit;
public final class DatabaseDemo {
public static void main(String[] args) throws Exception {
String url = System.getenv("FIREBASE_DATABASE_URL");
if (url == null || url.isBlank()) {
throw new IllegalArgumentException("FIREBASE_DATABASE_URL is required");
}
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setDatabaseUrl(url)
.build();
FirebaseApp app = FirebaseApp.initializeApp(options);
try {
DatabaseReference demo = FirebaseDatabase.getInstance(app)
.getReference("demo-smartquery/user1");
demo.setValueAsync("John Doe").get(15, TimeUnit.SECONDS);
System.out.println("Test write acknowledged");
} finally {
app.delete();
}
}
}Запускайте пример только в тестовом проекте. setValueAsync заменяет значение в выбранном узле, а не дописывает его к прежнему. Ожидание Future нужно, чтобы завершение процесса не маскировало незавершённую запись. Таймаут ожидания не доказывает, что сервер не применил операцию: перед повтором проверьте состояние.
Читать данные асинхронно
Для однократного чтения Java Admin SDK предоставляет addListenerForSingleValueEvent. Получайте значение через DataSnapshot в onDataChange и обрабатывайте DatabaseError в onCancelled. Сам факт регистрации listener ещё не означает, что данные получены; жизненный цикл приложения должен позволить callback завершиться.
Какие функции относятся к серверу
Admin SDK позволяет управлять пользователями Authentication, проверять ID-токены, обращаться к поддерживаемым базам и отправлять FCM-сообщения. Это не означает, что сервер входит в аккаунт пользователя так же, как клиентский SDK. Security Rules и права привилегированного сервера имеют разные роли: проверяйте доступ пользователя в своём серверном коде и назначайте минимальные полномочия identity.