Uwierzytelnianie żądań REST

Pakiety SDK Firebase obsługują w Twoim imieniu uwierzytelnianie i komunikację z Firebase Realtime Database. Jeśli jednak korzystasz z otoczenia, w którym nie ma pakietu SDK klienta lub chcesz uniknąć nadmiernego obciążania trwałego połączenia z bazą danych, możesz odczytywać i zapisywać dane za pomocą interfejsu API RESTRealtime Database.

Uwierzytelniaj użytkowników za pomocą jednej z tych metod:

  1. Tokeny dostępu Google OAuth2 – zazwyczaj możliwość odczytu i zapisu do Realtime Database jest regulowana przez Zasady Realtime Database. Możesz jednak uzyskać dostęp do swoich danych z serwera i przyznać mu pełne uprawnienia do odczytu i zapisu danych za pomocą tokena dostępu Google OAuth2 wygenerowanego na koncie usługi.

  2. Tokeny Firebase ID – możesz też wysyłać żądania uwierzytelnione jako pojedynczy użytkownik, np. ograniczając dostęp za pomocą Realtime Databasereguł w pakietach SDK klienta. Interfejs REST API akceptuje te same tokeny identyfikatora Firebase, które są używane przez pakiety SDK klienta.

Tokeny dostępu Google OAuth2

Wszystkie dane, które są dostępne do odczytu lub zapisu zgodnie z regułami Realtime Database, są też czytelne i możliwe do zapisu za pomocą interfejsu API REST bez konieczności uwierzytelniania. Jeśli jednak chcesz, aby Twój serwer pomijał reguły Realtime Database, musisz uwierzytelnić swoje żądania odczytu i zapisu. Aby uwierzytelnić się za pomocą protokołu Google OAuth2, wykonaj te czynności:

  1. Wygeneruj token dostępu.
  2. Uwierzytelnij się, korzystając z tego tokena dostępu.

Generowanie tokena dostępu

Interfejs API typu REST Realtime Database akceptuje standardowe tokeny dostępu Google OAuth2. Tokeny dostępu można wygenerować za pomocą konta usługi z odpowiednimi uprawnieniami na koncie Realtime Database. Kliknięcie przycisku Wygeneruj nowy klucz prywatny u dołu sekcji Konta usługi konsoli Firebase pozwala łatwo wygenerować nowy plik klucza konta usługi, jeśli go jeszcze nie masz.

Gdy masz już plik klucza konta usługi, możesz użyć jednej z bibliotek klienta interfejsu API Google, aby wygenerować token dostępu OAuth 2 Google z tymi wymaganymi zakresami:

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

Oto kilka przykładowych implementacji, które pokazują, jak utworzyć tokeny dostępu Google OAuth 2 do uwierzytelniania się w interfejsie API REST Realtime Database w różnych językach:

Node.js

Korzystając z biblioteki klienta interfejsu Google API dla 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.
  }
});

Java

Korzystając z biblioteki klienta interfejsów API Google do języka 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.

Python

Korzystanie z biblioteki 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

Uwierzytelnianie za pomocą tokena dostępu

Aby wysyłać uwierzytelnione żądania do interfejsu API REST Realtime Database, prześlij wygenerowany powyżej token dostępu Google OAuth2 jako nagłówek Authorization: Bearer <ACCESS_TOKEN> lub parametr ciągu zapytań access_token=<ACCESS_TOKEN>. Oto przykład curlżądania odczytania imienia Ada:

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

Zastąp <DATABASE_NAME> nazwą Realtime Database, a <ACCESS_TOKEN> – tokenem dostępu Google OAuth 2.

Pomyślne żądanie będzie oznaczone kodem stanu HTTP 200 OK. Odpowiedź zawiera pobierane dane:

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

Tokeny Firebase ID

Gdy użytkownik lub urządzenie loguje się za pomocą Firebase Authentication, Firebase tworzy odpowiedni token identyfikatora, który jednoznacznie go identyfikuje i pozwala uzyskać dostęp do kilku zasobów, takich jak Realtime DatabaseCloud Storage. Możesz go ponownie użyć do uwierzytelnienia interfejsu API REST Realtime Database i wysyłania żądań w imieniu tego użytkownika.

Generowanie tokena identyfikacyjnego

Aby pobrać token identyfikatora Firebase z klienta, wykonaj czynności opisane w sekcji Pobieranie tokenów identyfikatora na klientach.

Pamiętaj, że tokeny tożsamości wygasają po krótkim czasie i należy ich użyć jak najszybciej po ich pobraniu.

Uwierzytelnienie za pomocą tokena tożsamości

Aby wysyłać uwierzytelnione żądania do interfejsu API REST Realtime Database, prześlij wygenerowany powyżej token identyfikatora jako parametr ciągu zapytań auth=<ID_TOKEN>. Oto przykład curlżądania odczytania imienia Ada:

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

Pamiętaj, aby zastąpić <DATABASE_NAME> nazwą Realtime Database, a <ID_TOKEN> – tokenem Firebase ID.

Pomyślne żądanie będzie oznaczone kodem stanu HTTP 200 OK. Odpowiedź zawiera pobierane dane:

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

Starsze tokeny

Jeśli nadal używasz starszych tokenów uwierzytelniania Firebase, zalecamy zaktualizowanie uwierzytelniania REST do jednej z opisanych wyżej metod uwierzytelniania.

Interfejs API REST Realtime Database nadal obsługuje uwierzytelnianie za pomocą starszych tokenów uwierzytelniania, w tym obiektów tajnych. Twoje obiekty tajne Realtime Database znajdziesz w sekcji Konta usługi w konsoli Firebase.

Obiekty tajne to długotrwałe dane logowania. Zalecamy wygenerowanie nowego tajnego klucza i wycofanie dotychczasowego, gdy usuniesz z projektu użytkowników z dostępem do tajnego klucza (np. właścicieli).