Аутентифицировать REST-запросы

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

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

  1. Токены доступа Google OAuth2 . Как правило, возможность чтения и записи в базу данных реального времени регулируется правилами базы данных реального времени . Но вы можете получить доступ к своим данным с сервера и предоставить этому серверу полный доступ для чтения и записи к вашим данным с помощью токена доступа Google OAuth2, сгенерированного из учетной записи службы.

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

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

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

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

Создать токен доступа

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

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

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

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

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 базы данных реального времени, передайте сгенерированный выше токен доступа 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> именем вашей базы данных реального времени и <ACCESS_TOKEN> токеном доступа Google OAuth2.

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

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

Токены идентификатора Firebase

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

Создать идентификационный токен

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

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

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

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

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

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

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

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

Унаследованные токены

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

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

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