Добавьте Firebase Admin SDK на свой сервер

Admin SDK - это набор серверных библиотек, который позволяет вам взаимодействовать с Firebase из привилегированных сред для выполнения таких действий, как:

  • Чтение и запись данных базы данных в реальном времени с полными правами администратора.
  • Программно отправляйте сообщения Firebase Cloud Messaging, используя простой альтернативный подход к протоколам сервера Firebase Cloud Messaging.
  • Создание и проверка токенов аутентификации Firebase.
  • Получите доступ к ресурсам Google Cloud, таким как корзины Cloud Storage и базы данных Cloud Firestore, связанные с вашими проектами Firebase.
  • Создайте собственную упрощенную консоль администратора, чтобы выполнять такие действия, как поиск пользовательских данных или изменение адреса электронной почты пользователя для аутентификации.

Если вы заинтересованы в использовании пакета SDK для Node.js в качестве клиента для доступа конечных пользователей (например, на рабочем столе Node.js или в приложении IoT), в отличие от доступа администратора из привилегированной среды (например, сервера), вы вместо этого должны следовать инструкциям по настройке клиента JavaScript SDK .

Вот матрица функций, показывающая, какие функции Firebase поддерживаются на каждом языке:

Характерная черта Node.js Джава Python Идти C #
Изготовление нестандартных токенов
Проверка идентификатора токена
Управление пользователями
Контроль доступа с помощью настраиваемых утверждений
Обновить отзыв токена
Импортировать пользователей
Управление сессионными файлами cookie
Создание ссылок на действия по электронной почте
Управление конфигурациями провайдера SAML / OIDC
Поддержка мультиарендности
База данных в реальном времени *
Обмен сообщениями Firebase Cloud
FCM Multicast
Управление подписками на темы FCM
Облачное хранилище
Cloud Firestore
Управление проектом
Правила безопасности
Управление моделями машинного обучения
Удаленная конфигурация Firebase
Проверка приложения Firebase

Чтобы узнать больше об интеграции Admin SDK для этих целей, см соответствующих реального времени базов данных , ТСМ , аутентификация , Remote Config и Cloud Storage документации. Остальная часть этой страницы посвящена базовой настройке Admin SDK.

Предпосылки

  • Убедитесь, что у вас есть серверное приложение.

  • Убедитесь, что на вашем сервере выполняется следующее, в зависимости от того, какой Admin SDK вы используете:

    • SDK для администрирования Node.js - Node.js 10.13.0+
    • Admin Java SDK - Java 7+ (рекомендуется Java 8+)
      Поддержка Java 7 устарела.
    • SDK для администрирования Python - Python 3.6+
    • Admin Go SDK - Go 1.11+
    • Admin .NET SDK - .NET Framework 4.5+ или .Net Core 1.5+

Настройте проект Firebase и сервисный аккаунт

Чтобы использовать Firebase Admin SDK, вам понадобится следующее:

  • Проект Firebase
  • Учетная запись службы для связи с Firebase
  • Файл конфигурации с учетными данными вашей служебной учетной записи.

Если вы не уже есть проект Firebase, вам нужно создать в консоли Firebase . Визит Понимать Firebase Проекты более узнать о проектах Firebase.

Добавить SDK

Если вы настраиваете новый проект, вам необходимо установить SDK для выбранного вами языка.

Node.js

SDK Firebase Admin Node.js доступен на npm. Если у вас еще нет package.json файла, создать с помощью npm init . Затем установите firebase-admin пакет NPM и сохранить его на package.json :

$ npm install firebase-admin --save

Чтобы использовать модуль в приложении, require его из любого файла JavaScript:

var admin = require('firebase-admin');

Если вы используете ES2015, вы можете import модуль вместо этого:

import * as admin from 'firebase-admin';

Джава

Java SDK для Firebase Admin публикуется в центральном репозитории Maven. Чтобы установить библиотеку, объявить его как зависимость в вашем build.gradle файла:

dependencies {
  implementation 'com.google.firebase:firebase-admin:8.1.0'
}

Если вы используете Maven для сборки приложений, вы можете добавить следующую зависимость для вашего pom.xml :

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>8.1.0</version>
</dependency>

Python

Firebase Администратор Python SDK доступен через пип . Вы можете установить библиотеку для всех пользователей через sudo :

$ sudo pip install firebase-admin

Или, вы можете установить библиотеку только для текущего пользователя, передавая --user флаг:

$ pip install --user firebase-admin

Идти

Go Admin SDK может быть установлен с помощью go get утилиты:

# Install as a module dependency
$ go get firebase.google.com/go/v4

# Install to $GOPATH
$ go get firebase.google.com/go

C #

.NET Admin SDK можно установить с помощью диспетчера пакетов .NET:

$ Install-Package FirebaseAdmin -Version 2.2.0

С другой стороны , установить его с помощью dotnet утилиты командной строки:

$ dotnet add package FirebaseAdmin --version 2.2.0

Или, вы можете установить его, добавив эталонную запись следующего пакета к вашему .csproj файл:

<ItemGroup>
  <PackageReference Include="FirebaseAdmin" Version="2.2.0" />
</ItemGroup>

Инициализировать SDK

После того, как вы создали проект Firebase, вы можете инициализировать SDK с стратегией авторизации , которая объединяет файл учетной записи службы совместно с Google , используемыми по умолчанию полномочий .

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

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

Чтобы сгенерировать файл закрытого ключа для вашей учетной записи службы:

  1. В Firebase консоли откройте Настройки> Учетные записи служб .

  2. Нажмите кнопку Создать новый секретный ключ, а затем подтвердить, нажав Создать ключ.

  3. Надежно храните файл JSON, содержащий ключ.

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

Чтобы установить переменную среды:

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

Linux или macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Окна

С PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

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

Инициализируйте SDK, как показано:

Node.js

admin.initializeApp({
    credential: admin.credential.applicationDefault(),
    databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Джава

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Идти

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C #

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

Использование токена обновления OAuth 2.0

Администратор SDK также предоставляет учетные данные , которая позволяет проверить подлинность с помощью Google OAuth2 обновления маркеров:

Node.js

const refreshToken = '...'; // Get refresh token from OAuth2 flow

admin.initializeApp({
  credential: admin.credential.refreshToken(refreshToken),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Джава

FileInputStream refreshToken = new FileInputStream("path/to/refreshToken.json");

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.fromStream(refreshToken))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

cred = credentials.RefreshToken('path/to/refreshToken.json')
default_app = firebase_admin.initialize_app(cred)

Идти

opt := option.WithCredentialsFile("path/to/refreshToken.json")
config := &firebase.Config{ProjectID: "my-project-id"}
app, err := firebase.NewApp(context.Background(), config, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C #

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromFile("path/to/refreshToken.json"),
});

Инициализировать без параметров

SDK также можно инициализировать без параметров. В этом случае SDK использует Google , используемый по умолчанию учетные данные . Поскольку поиск учетных данных по умолчанию в средах Google полностью автоматизирован, без необходимости указывать переменные среды или другую конфигурацию, этот способ инициализации SDK настоятельно рекомендуется для приложений, работающих на Compute Engine, Kubernetes Engine, App Engine и Cloud Functions.

Чтобы дополнительно указать инициализации параметров для таких услуг, как в реальном времени базы данных, Cloud Storage, или облачных функций, используйте FIREBASE_CONFIG переменную окружения. Если содержание FIREBASE_CONFIG переменной начинается с { он будет проанализирован в качестве объекта JSON. В противном случае SDK предполагает, что строка - это путь к файлу JSON, содержащему параметры.

Node.js

const app = admin.initializeApp();

Джава

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

Идти

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C #

FirebaseApp.Create();

После инициализации вы можете использовать Admin SDK для выполнения следующих типов задач:

Инициализировать несколько приложений

В большинстве случаев вам нужно инициализировать только одно приложение по умолчанию. Вы можете получить доступ к службам из этого приложения двумя эквивалентными способами:

Node.js

// Initialize the default app
const defaultApp = admin.initializeApp(defaultAppConfig);

console.log(defaultApp.name);  // '[DEFAULT]'

// Retrieve services via the defaultApp variable...
let defaultAuth = defaultApp.auth();
let defaultDatabase = defaultApp.database();

// ... or use the equivalent shorthand notation
defaultAuth = admin.auth();
defaultDatabase = admin.database();

Джава

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

System.out.println(defaultApp.getName());  // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
FirebaseAuth defaultAuth = FirebaseAuth.getInstance(defaultApp);
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.getInstance();
defaultDatabase = FirebaseDatabase.getInstance();

Python

# Import the Firebase service
from firebase_admin import auth

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)
print(default_app.name)  # "[DEFAULT]"

# Retrieve services via the auth package...
# auth.create_custom_token(...)

Идти

// Initialize default app
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access auth service from the default app
client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C #

// Initialize the default app
var defaultApp = FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
var defaultAuth = FirebaseAuth.GetAuth(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.DefaultInstance;

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

Node.js

// Initialize the default app
admin.initializeApp(defaultAppConfig);

// Initialize another app with a different config
var otherApp = admin.initializeApp(otherAppConfig, 'other');

console.log(admin.app().name);  // '[DEFAULT]'
console.log(otherApp.name);     // 'other'

// Use the shorthand notation to retrieve the default app's services
const defaultAuth = admin.auth();
const defaultDatabase = admin.database();

// Use the otherApp variable to retrieve the other app's services
const otherAuth = otherApp.auth();
const otherDatabase = otherApp.database();

Джава

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

// Initialize another app with a different config
FirebaseApp otherApp = FirebaseApp.initializeApp(otherAppConfig, "other");

System.out.println(defaultApp.getName());  // "[DEFAULT]"
System.out.println(otherApp.getName());    // "other"

// Use the shorthand notation to retrieve the default app's services
FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance();

// Use the otherApp variable to retrieve the other app's services
FirebaseAuth otherAuth = FirebaseAuth.getInstance(otherApp);
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Python

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)

#  Initialize another app with a different config
other_app = firebase_admin.initialize_app(cred, name='other')

print(default_app.name)    # "[DEFAULT]"
print(other_app.name)      # "other"

# Retrieve default services via the auth package...
# auth.create_custom_token(...)

# Use the `app` argument to retrieve the other app's services
# auth.create_custom_token(..., app=other_app)

Идти

// Initialize the default app
defaultApp, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Initialize another app with a different config
opt := option.WithCredentialsFile("service-account-other.json")
otherApp, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access Auth service from default app
defaultClient, err := defaultApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

// Access auth service from other app
otherClient, err := otherApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C #

// Initialize the default app
var defaultApp = FirebaseApp.Create(defaultOptions);

// Initialize another app with a different config
var otherApp = FirebaseApp.Create(otherAppConfig, "other");

Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
Console.WriteLine(otherApp.Name); // "other"

// Use the shorthand notation to retrieve the default app's services
var defaultAuth = FirebaseAuth.DefaultInstance;

// Use the otherApp variable to retrieve the other app's services
var otherAuth = FirebaseAuth.GetAuth(otherApp);

Установить области для базы данных в реальном времени и аутентификации

Если вы используете Google Compute Engine VM с Google , используемыми по умолчанию учетных данных для реального времени базы данных или проверки подлинности, убедитесь также установить правильные области доступа . Для реального времени базы данных и проверки подлинности, необходимы области , оканчивающихся в userinfo.email и любой cloud-platform или firebase.database . Для проверки существующих областей доступа и изменить их, выполните следующие команды с помощью gcloud .

gcloud

# Check the existing access scopes
gcloud compute instances describe [INSTANCE_NAME] --format json

# The above command returns the service account information. For example:
  "serviceAccounts": [
   {
    "email": "your.gserviceaccount.com",
    "scopes": [
     "https://www.googleapis.com/auth/cloud-platform",
     "https://www.googleapis.com/auth/userinfo.email"
     ]
    }
  ],

# Stop the VM, then run the following command, using the service account
# that gcloud returned when you checked the scopes.

gcloud compute instances set-service-account [INSTANCE_NAME] --service-account "your.gserviceaccount.com" --scopes "https://www.googleapis.com/auth/firebase.database,https://www.googleapis.com/auth/userinfo.email"

Тестирование с учетными данными конечного пользователя gcloud

При тестировании Admin SDK локально с Google , gcloud auth application-default login используемый по умолчанию полномочий , полученных путем запуска gcloud auth application-default login по gcloud auth application-default login , дополнительные изменения необходимы для использования Firebase аутентификации обусловлено следующим:

  • Firebase Authentication не принимает учетные данные конечного пользователя gcloud, созданные с использованием идентификатора клиента gcloud OAuth.
  • Для аутентификации Firebase требуется, чтобы идентификатор проекта был предоставлен при инициализации для этого типа учетных данных конечного пользователя.

В качестве обходного пути, вы можете создавать приложение Google по умолчанию учетных данных в gcloud используя собственный OAuth 2.0 идентификатора клиента . OAuth идентификатор клиента должен быть типом приложения настольного приложения.

gcloud

gcloud auth application-default login --client-id-file=[/path/to/client/id/file]

Вы можете указать идентификатор проекта в явном виде при инициализации приложения или просто использовать GOOGLE_CLOUD_PROJECT переменного окружения. Последнее избавляет от необходимости вносить какие-либо дополнительные изменения для тестирования вашего кода.

Чтобы явно указать идентификатор проекта:

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  projectId: '<FIREBASE_PROJECT_ID>',
});

Джава

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setProjectId("<FIREBASE_PROJECT_ID>")
    .build();

FirebaseApp.initializeApp(options);

Python

app_options = {'projectId': '<FIREBASE_PROJECT_ID>'}
default_app = firebase_admin.initialize_app(options=app_options)

Идти

config := &firebase.Config{ProjectID: "<FIREBASE_PROJECT_ID>"}
app, err := firebase.NewApp(context.Background(), config)
if err != nil {
        log.Fatalf("error initializing app: %v\n", err)
}

C #

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "<FIREBASE_PROJECT_ID>",
});

Следующие шаги

Узнайте о Firebase:

Добавьте в приложение функции Firebase: