Аутентификация запросов REST

Пакеты Firebase SDK обеспечивают всю аутентификацию и взаимодействие с Firebase Realtime Database от вашего имени. Однако, если вы работаете в среде без клиентского SDK или хотите избежать накладных расходов на постоянное подключение к базе данных, вы можете использовать REST API Realtime Database для чтения и записи данных.

Аутентифицируйте пользователей одним из следующих методов:

  1. Токены доступа Google OAuth2 — как правило, возможность чтения и записи в Realtime Database регулируется правилами Realtime Database . Однако вы можете получить доступ к своим данным с сервера и предоставить этому серверу полный доступ на чтение и запись с помощью токена доступа Google OAuth2, сгенерированного с помощью учётной записи сервиса.

  2. Токены Firebase ID . Вы также можете отправлять запросы, аутентифицированные как отдельные пользователи, например, ограничивая доступ с помощью правил Realtime Database Rules в клиентских SDK. REST API принимает те же токены Firebase ID, что и клиентские SDK.

Токены доступа Google OAuth2

Любые данные, доступные для чтения или записи публично в соответствии с вашими правилами Realtime Database , также доступны для чтения и записи через REST API без аутентификации. Однако, если вы хотите, чтобы ваш сервер обходил ваши правила Realtime Database , вам необходимо аутентифицировать запросы на чтение и запись. Для аутентификации через Google OAuth2 необходимо выполнить следующие шаги:

  1. Сгенерируйте токен доступа.
  2. Выполните аутентификацию с помощью этого токена доступа.

Сгенерировать токен доступа

REST API Realtime Database принимает стандартные токены доступа Google OAuth2 . Токены доступа можно сгенерировать, используя учетную запись службы с соответствующими правами доступа к вашей Realtime Database . Нажатие кнопки «Сгенерировать новый закрытый ключ» в нижней части раздела «Учетные записи служб» консоли Firebase позволяет легко сгенерировать новый файл ключа учетной записи службы, если у вас его еще нет.

Получив файл ключа учетной записи службы, вы можете использовать одну из клиентских библиотек API Google для генерации токена доступа Google OAuth2 со следующими требуемыми областями действия:

  • https://www.googleapis.com/auth/userinfo.email
  • https://www.googleapis.com/auth/firebase.database

Ниже приведены несколько примеров реализаций, показывающих, как создавать токены доступа Google OAuth2 для аутентификации в REST API Realtime Database на разных языках:

Node.js

Использование клиентской библиотеки Google API для Node.js :

var {google} = require("googleapis");

// Load the service account key JSON file.
var serviceAccount = require("path/to/serviceAccountKey.json");

// Define the required scopes.
var scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
];

// Authenticate a JWT client with the service account.
var jwtClient = new google.auth.JWT(
  serviceAccount.client_email,
  null,
  serviceAccount.private_key,
  scopes
);

// Use the JWT client to generate an access token.
jwtClient.authorize(function(error, tokens) {
  if (error) {
    console.log("Error making request to generate access token:", error);
  } else if (tokens.access_token === null) {
    console.log("Provided service account does not have permission to generate access tokens");
  } else {
    var accessToken = tokens.access_token;

    // See the "Using the access token" section below for information
    // on how to use the access token to send authenticated requests to
    // the Realtime Database REST API.
  }
});

Ява

Использование клиентской библиотеки Google API для Java :

// Load the service account key JSON file
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

// Authenticate a Google credential with the service account
GoogleCredential googleCred = GoogleCredential.fromStream(serviceAccount);

// Add the required scopes to the Google credential
GoogleCredential scoped = googleCred.createScoped(
    Arrays.asList(
      "https://www.googleapis.com/auth/firebase.database",
      "https://www.googleapis.com/auth/userinfo.email"
    )
);

// Use the Google credential to generate an access token
scoped.refreshToken();
String token = scoped.getAccessToken();

// See the "Using the access token" section below for information
// on how to use the access token to send authenticated requests to the
// Realtime Database REST API.

Питон

Использование библиотеки google-auth :

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

# Define the required scopes
scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
]

# Authenticate a credential with the service account
credentials = service_account.Credentials.from_service_account_file(
    "path/to/serviceAccountKey.json", scopes=scopes)

# Use the credentials object to authenticate a Requests session.
authed_session = AuthorizedSession(credentials)
response = authed_session.get(
    "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json")

# Or, use the token directly, as described in the "Authenticate with an
# access token" section below. (not recommended)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
access_token = credentials.token

Аутентификация с помощью токена доступа

Для отправки аутентифицированных запросов к REST API Realtime Database передайте сгенерированный выше токен доступа Google OAuth2 в качестве заголовка Authorization: Bearer <ACCESS_TOKEN> или параметра строки запроса access_token=<ACCESS_TOKEN> . Вот пример curl запроса для чтения имени Ады:

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?access_token=<ACCESS_TOKEN>"

Обязательно замените <DATABASE_NAME> на имя вашей Realtime Database , а <ACCESS_TOKEN> на токен доступа Google OAuth2.

Успешный запрос будет подтвержден кодом статуса HTTP 200 OK . Ответ содержит извлекаемые данные:

{"first":"Ada","last":"Lovelace"}

Идентификационные токены Firebase

Когда пользователь или устройство входит в систему с использованием Firebase Authentication , Firebase создаёт соответствующий уникальный токен, который идентифицирует пользователя и предоставляет ему доступ к различным ресурсам, таким как Realtime Database и Cloud Storage . Вы можете повторно использовать этот токен для аутентификации REST API Realtime Database и выполнения запросов от имени этого пользователя.

Сгенерировать идентификационный токен

Чтобы получить токен Firebase ID от клиента, следуйте инструкциям в разделе Получение токенов ID на клиентах .

Обратите внимание, что срок действия идентификационных токенов истекает через короткий промежуток времени, поэтому их следует использовать как можно быстрее после получения.

Аутентификация с помощью идентификационного токена

Для отправки аутентифицированных запросов к REST API Realtime Database передайте сгенерированный выше идентификатор токена в качестве параметра строки запроса auth=<ID_TOKEN> . Вот пример curl -запроса для чтения имени Ады:

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>"

Обязательно замените <DATABASE_NAME> на имя вашей Realtime Database , а <ID_TOKEN> на токен идентификатора Firebase.

Успешный запрос будет подтвержден кодом статуса HTTP 200 OK . Ответ содержит извлекаемые данные:

{"first":"Ada","last":"Lovelace"}

Устаревшие токены

Если вы все еще используете устаревшие токены аутентификации Firebase, мы рекомендуем обновить вашу аутентификацию REST на один из методов аутентификации, описанных выше.

REST API Realtime Database по-прежнему поддерживает аутентификацию с помощью устаревших токенов аутентификации, включая секреты . Секреты Realtime Database можно найти в разделе « Учётные записи служб» консоли Firebase .

Секреты — это долгосрочные учётные данные. Мы рекомендуем создать новый секрет и отозвать существующий при удалении пользователей с секретным доступом (например, владельцев) из проекта.