Firebase SDKs обрабатывают всю аутентификацию и связь с Firebase Realtime Database от вашего имени. Однако, когда вы находитесь в среде, в которой нет клиентского SDK, или вы хотите избежать накладных расходов на постоянное подключение к базе данных, вы можете использовать Realtime Database REST API для чтения и записи данных.
Аутентифицируйте пользователей одним из следующих способов:
Токены доступа Google OAuth2 — как правило, возможность чтения и записи в Realtime Database регулируется Realtime Database Rules . Но вы можете получить доступ к своим данным с сервера и предоставить этому серверу полный доступ на чтение и запись к вашим данным с помощью токена доступа Google OAuth2, сгенерированного из учетной записи службы.
Firebase ID tokens - Вы также можете захотеть отправлять запросы, аутентифицированные как отдельный пользователь, например, ограничивая доступ с помощью Realtime Database Rules на клиентских SDK. REST API принимает те же Firebase ID tokens, которые используются клиентскими SDK.
Токены доступа Google OAuth2
Любые данные, которые публично доступны для чтения или записи в соответствии с вашими правилами Realtime Database , также доступны для чтения и записи через REST API без какой-либо аутентификации. Однако, если вы хотите, чтобы ваш сервер обходил ваши правила Realtime Database , вам необходимо аутентифицировать ваши запросы на чтение и запись. Аутентификация через Google OAuth2 требует следующих шагов:
- Сгенерируйте токен доступа.
- Выполните аутентификацию с помощью этого токена доступа.
Сгенерировать токен доступа
Realtime Database REST API принимает стандартные токены доступа Google OAuth2 . Токены доступа можно сгенерировать с помощью учетной записи службы с соответствующими разрешениями для вашей Realtime Database . Нажатие кнопки Generate New Private Key в нижней части раздела Service Accounts консоли 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
Аутентификация с помощью токена доступа
Чтобы отправлять аутентифицированные запросы в Realtime Database 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>
на имя вашей Realtime Database , а <ACCESS_TOKEN>
на токен доступа Google OAuth2.
Успешный запрос будет обозначен кодом статуса HTTP 200 OK
. Ответ содержит извлекаемые данные:
{"first":"Ada","last":"Lovelace"}
Идентификационные токены Firebase
Когда пользователь или устройство входит в систему с помощью Firebase Authentication , Firebase создает соответствующий токен ID, который уникально идентифицирует их и предоставляет им доступ к нескольким ресурсам, таким как Realtime Database и Cloud Storage . Вы можете повторно использовать этот токен ID для аутентификации Realtime Database REST API и делать запросы от имени этого пользователя.
Сгенерировать идентификационный токен
Чтобы получить токен Firebase ID от клиента, следуйте инструкциям в разделе Получение токенов ID на клиентах .
Обратите внимание, что срок действия идентификационных токенов истекает через короткий промежуток времени, поэтому их следует использовать как можно быстрее после получения.
Аутентификация с помощью токена ID
Чтобы отправлять аутентифицированные запросы в Realtime Database REST API, передайте сгенерированный выше идентификатор токена в качестве параметра строки запроса auth=<ID_TOKEN>
. Вот пример запроса curl
для чтения имени Ады:
curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>"
Обязательно замените <DATABASE_NAME>
на имя вашей Realtime Database , а <ID_TOKEN>
на токен Firebase ID.
Успешный запрос будет обозначен кодом статуса HTTP 200 OK
. Ответ содержит извлекаемые данные:
{"first":"Ada","last":"Lovelace"}
Устаревшие токены
Если вы все еще используете устаревшие токены аутентификации Firebase, мы рекомендуем обновить вашу аутентификацию REST до одного из методов аутентификации, описанных выше.
Realtime Database REST API по-прежнему поддерживает аутентификацию через устаревшие токены аутентификации, включая секреты . Ваши секреты Realtime Database можно найти в разделе Service Accounts консоли Firebase .
Секреты — это долгосрочные учетные данные. Мы рекомендуем создать новый секрет и отозвать существующий при удалении пользователей с секретным доступом (например, владельцев) из проекта.