Autentica le richieste REST

Gli SDK Firebase gestiscono per tuo conto tutte le autenticazioni e le comunicazioni con Firebase Realtime Database. Tuttavia, se ti trovi in un ambiente che non dispone di un SDK client o se vuoi evitare il sovraccarico di una connessione al database permanente, puoi utilizzare l'API REST Realtime Database per leggere e scrivere i dati.

Autentica gli utenti tramite uno dei seguenti metodi:

  1. Token di accesso OAuth2 di Google: in genere, la possibilità di leggere e scrivere nel Realtime Database è regolata dalle Regole di Realtime Database. Tuttavia, puoi accedere ai tuoi dati da un server e concedere a questo server l'accesso in lettura e scrittura completo ai tuoi dati con un token di accesso OAuth2 di Google generato da un account di servizio.

  2. Token ID Firebase: potresti anche inviare richieste autenticate come singolo utente, ad esempio limitando l'accesso con le Realtime Databaseregole negli SDK client. L'API REST accetta gli stessi token ID Firebase utilizzati dagli SDK client.

Token di accesso OAuth2 di Google

Tutti i dati leggibili o scrivibili pubblicamente in base alle tue Realtime Database Regole sono leggibili e scrivibili anche tramite l'API REST senza alcuna autenticazione. Tuttavia, se vuoi che il tuo server ignori le regole Realtime Database, devi autenticare le richieste di lettura e scrittura. L'autenticazione tramite OAuth2 di Google richiede i seguenti passaggi:

  1. Genera un token di accesso.
  2. Esegui l'autenticazione con il token di accesso.

Genera un token di accesso

L'API REST Realtime Database accetta token di accesso OAuth2 di Google standard. I token di accesso possono essere generati utilizzando un account di servizio con le autorizzazioni appropriate per Realtime Database. Se non ne hai già uno, puoi generare facilmente un nuovo file della chiave dell'account di servizio facendo clic sul pulsante Genera nuova chiave privata nella parte inferiore della sezione Account di servizio della console Firebase.

Una volta ottenuto un file della chiave dell'account di servizio, puoi utilizzare una delle librerie client dell'API di Google per generare un token di accesso OAuth2 di Google con i seguenti ambiti obbligatori:

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

Di seguito sono riportati alcuni esempi di implementazione che mostrano come creare token di accesso OAuth2 di Google per autenticarsi nell'API REST Realtime Database in diversi linguaggi:

Node.js

Utilizzo della libreria client dell'API di Google per 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

Utilizzo della libreria client delle API di Google per 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

Utilizzo della libreria 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

Autenticazione con un token di accesso

Per inviare richieste autenticate all'API REST Realtime Database, passa il token di accesso Google OAuth2 generato in precedenza come intestazione Authorization: Bearer <ACCESS_TOKEN> o come parametro della stringa di query access_token=<ACCESS_TOKEN>. Ecco un esempio di richiesta curl per leggere il nome di Ada:

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

Assicurati di sostituire <DATABASE_NAME> con il nome del tuo Realtime Database e <ACCESS_TOKEN> con un token di accesso OAuth2 di Google.

Una richiesta riuscita sarà indicata da un codice di stato HTTP 200 OK. La risposta contiene i dati recuperati:

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

Token ID Firebase

Quando un utente o un dispositivo accede utilizzando Firebase Authentication, Firebase crea un token ID corrispondente che lo identifica in modo univoco e gli concede l'accesso a diverse risorse, come Realtime Database e Cloud Storage. Puoi riutilizzare questo token ID per autenticare l'API REST Realtime Database e inviare richieste per conto dell'utente.

Generare un token ID

Per recuperare il token ID Firebase dal client, segui i passaggi descritti in Recuperare i token ID sui client.

Tieni presente che gli ID token scadono dopo un breve periodo di tempo e devono essere utilizzati il più rapidamente possibile dopo averli recuperati.

Autenticazione con un token ID

Per inviare richieste autenticate all'API REST Realtime Database, passa il token ID generato sopra come parametro della stringa di query auth=<ID_TOKEN>. Ecco un esempio di richiesta curl per leggere il nome di Ada:

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

Assicurati di sostituire <DATABASE_NAME> con il nome del tuo Realtime Database e <ID_TOKEN> con un token ID Firebase.

Una richiesta riuscita sarà indicata da un codice di stato HTTP 200 OK. La risposta contiene i dati recuperati:

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

Token legacy

Se utilizzi ancora i token di autenticazione Firebase precedenti, ti consigliamo di aggiornare l'autenticazione REST a uno dei metodi descritti sopra.

L'API REST Realtime Database supporta ancora l'autenticazione tramite i token di autenticazione legacy, inclusi i secret. I tuoi secret Realtime Database si trovano nella sezione Account di servizio della console Firebase.

I secret sono credenziali permanenti. Ti consigliamo di generare un nuovo segreto e di revocare quello esistente quando rimuovi da un progetto gli utenti con accesso ai segreti (ad esempio i proprietari).