Uwierzytelnianie żądań REST

Pakiety SDK Firebase obsługują w Twoim imieniu całe uwierzytelnianie i komunikację z Firebase Realtime Database. Jeśli jednak jesteś w środowisku, które nie ma pakietu SDK klienta, lub chcesz uniknąć obciążenia związanego z trwałym połączeniem z bazą danych, możesz użyć interfejsu Realtime Database REST API do odczytywania i zapisywania danych.

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

  1. Tokeny dostępu Google OAuth2 – zwykle możliwość odczytywania i zapisywania danych w Realtime Database jest regulowana przez Realtime Database reguły. Możesz jednak uzyskać dostęp do danych z serwera i przyznać mu pełne uprawnienia do odczytu i zapisu danych za pomocą tokena dostępu Google OAuth2 wygenerowanego na podstawie konta usługi.

  2. Tokeny identyfikatora Firebase – możesz też wysyłać żądania uwierzytelnione jako poszczególni użytkownicy, np. ograniczać 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

Wszelkie dane, które zgodnie z Twoimi Realtime Databaseregułami są publicznie dostępne do odczytu i zapisu, są też dostępne do odczytu i zapisu za pomocą interfejsu REST API bez uwierzytelniania. Jeśli jednak chcesz, aby serwer pomijał Realtime Database reguły, musisz uwierzytelniać żądania odczytu i zapisu. Uwierzytelnianie za pomocą protokołu OAuth2 od Google wymaga wykonania tych czynności:

  1. Wygeneruj token dostępu.
  2. Uwierzytelnij się za pomocą tego tokena dostępu.

Generowanie tokena dostępu

Interfejs Realtime Database REST API akceptuje standardowe tokeny dostępu OAuth2 Google. Tokeny dostępu można generować za pomocą konta usługi z odpowiednimi uprawnieniami do Realtime Database. Kliknięcie przycisku Wygeneruj nowy klucz prywatny u dołu sekcji Konta usługi w konsoli Firebase umożliwia łatwe wygenerowanie nowego pliku klucza konta usługi, jeśli jeszcze go nie masz.

Gdy będziesz mieć plik klucza konta usługi, możesz użyć jednej z bibliotek klienta interfejsów API Google, aby wygenerować token dostępu Google OAuth2 z tymi wymaganymi zakresami:

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

Oto przykłady implementacji, które pokazują, jak tworzyć tokeny dostępu Google OAuth2 do uwierzytelniania w Realtime Databaseinterfejsie REST API w różnych językach:

Node.js

Używanie Google API Client Library for 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

Korzystanie 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 Realtime Database REST API, przekaż wygenerowany powyżej token dostępu Google OAuth2 jako nagłówek Authorization: Bearer <ACCESS_TOKEN> lub parametr ciągu zapytania access_token=<ACCESS_TOKEN>. Oto przykładowe żądanie curl odczytania imienia Ada:

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

Pamiętaj, aby zastąpić <DATABASE_NAME> nazwą Twojej usługiRealtime Database, a <ACCESS_TOKEN> tokenem dostępu Google OAuth2.

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

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

Tokeny identyfikacyjne Firebase

Gdy użytkownik lub urządzenie loguje się za pomocą Firebase Authentication, Firebase tworzy odpowiedni token identyfikacyjny, który jednoznacznie identyfikuje użytkownika lub urządzenie i przyznaje mu dostęp do kilku zasobów, takich jak Realtime DatabaseCloud Storage. Możesz ponownie użyć tego tokena identyfikatora, aby uwierzytelnić interfejs Realtime Database REST API i wysyłać żądania w imieniu tego użytkownika.

Generowanie tokena tożsamości

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

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

Uwierzytelnianie za pomocą tokena tożsamości

Aby wysłać uwierzytelnione żądania do interfejsu Realtime Database REST API, przekaż wygenerowany powyżej token identyfikatora jako parametr ciągu zapytania auth=<ID_TOKEN>. Oto przykładowe curl żądanie odczytania imienia Ada:

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

Pamiętaj, aby zastąpić <DATABASE_NAME> nazwą TwojegoRealtime Database, a <ID_TOKEN> tokenem identyfikatora Firebase.

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

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

Tokeny starszego typu

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

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

Obiekty tajne to dane logowania o długim okresie ważności. Jeśli usuwasz z projektu użytkowników z dostępem tajnym (np. właścicieli), zalecamy wygenerowanie nowego klucza tajnego i unieważnienie dotychczasowego.