Authentifier les requêtes REST

Les SDK Firebase gèrent en votre nom toutes les authentifications et communications avec la base de données en temps réel Firebase. Cependant, lorsque vous êtes dans un environnement qui ne dispose pas de SDK client ou que vous souhaitez éviter la surcharge d'une connexion à une base de données persistante, vous pouvez utiliser l'API REST de la base de données en temps réel pour lire et écrire des données.

Authentifiez les utilisateurs via l'une des méthodes suivantes :

  1. Jetons d'accès Google OAuth2 : en règle générale, la possibilité de lire et d'écrire dans la base de données en temps réel est régie par les règles de base de données en temps réel . Mais vous pouvez accéder à vos données à partir d'un serveur et accorder à ce serveur un accès complet en lecture et en écriture à vos données avec un jeton d'accès Google OAuth2 généré à partir d'un compte de service.

  2. Jetons d'identification Firebase : vous pouvez également envoyer des requêtes authentifiées en tant qu'utilisateur individuel, par exemple en limitant l'accès avec des règles de base de données en temps réel sur les SDK clients. L'API REST accepte les mêmes jetons d'ID Firebase que ceux utilisés par les SDK clients.

Jetons d'accès Google OAuth2

Toutes les données publiquement lisibles ou inscriptibles conformément à vos règles de base de données en temps réel sont également lisibles et inscriptibles via l'API REST sans aucune authentification. Cependant, si vous souhaitez que votre serveur contourne vos règles de base de données en temps réel, vous devez authentifier vos demandes de lecture et d'écriture. L'authentification via Google OAuth2 nécessite les étapes suivantes :

  1. Générez un jeton d'accès.
  2. Authentifiez-vous avec ce jeton d'accès.

Générer un jeton d'accès

L'API REST Realtime Database accepte les jetons d'accès Google OAuth2 standard. Les jetons d'accès peuvent être générés à l'aide d'un compte de service disposant des autorisations appropriées sur votre base de données en temps réel. En cliquant sur le bouton Générer une nouvelle clé privée en bas de la section Comptes de service de la console Firebase, vous pouvez facilement générer un nouveau fichier de clé de compte de service si vous n'en avez pas déjà un.

Une fois que vous disposez d'un fichier de clé de compte de service, vous pouvez utiliser l'une des bibliothèques clientes de l'API Google pour générer un jeton d'accès Google OAuth2 avec les étendues requises suivantes :

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

Voici quelques exemples d'implémentations qui montrent comment créer des jetons d'accès Google OAuth2 pour s'authentifier auprès de l'API REST de la base de données en temps réel dans divers langages :

Noeud.js

Utilisation de la bibliothèque cliente de l'API Google pour 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

Utilisation de la bibliothèque cliente de l'API Google pour 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

Utilisation de la bibliothèque 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

S'authentifier avec un jeton d'accès

Pour envoyer des requêtes authentifiées à l'API REST de Realtime Database, transmettez le jeton d'accès Google OAuth2 généré ci-dessus comme en-tête Authorization: Bearer <ACCESS_TOKEN> ou comme paramètre de chaîne de requête access_token=<ACCESS_TOKEN> . Voici un exemple de requête curl pour lire le nom d'Ada :

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

Assurez-vous de remplacer <DATABASE_NAME> par le nom de votre base de données en temps réel et <ACCESS_TOKEN> par un jeton d'accès Google OAuth2.

Une demande réussie sera indiquée par un code d’état HTTP 200 OK . La réponse contient les données en cours de récupération :

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

Jetons d'identification Firebase

Lorsqu'un utilisateur ou un appareil se connecte à l'aide de l'authentification Firebase, Firebase crée un jeton d'identification correspondant qui l'identifie de manière unique et lui accorde l'accès à plusieurs ressources, telles que la base de données en temps réel et le stockage cloud. Vous pouvez réutiliser ce jeton d'ID pour authentifier l'API REST Realtime Database et effectuer des demandes au nom de cet utilisateur.

Générer un jeton d'identification

Pour récupérer le jeton d'identification Firebase du client, suivez les étapes décrites dans Récupérer les jetons d'identification sur les clients .

Notez que les jetons d'identification expirent après une courte période et doivent être utilisés le plus rapidement possible après leur récupération.

S'authentifier avec un jeton d'identification

Pour envoyer des requêtes authentifiées à l'API REST Realtime Database, transmettez le jeton d'ID généré ci-dessus en tant que paramètre de chaîne de requête auth=<ID_TOKEN> . Voici un exemple de requête curl pour lire le nom d'Ada :

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

Assurez-vous de remplacer <DATABASE_NAME> par le nom de votre base de données en temps réel et <ID_TOKEN> par un jeton d'identification Firebase.

Une demande réussie sera indiquée par un code d’état HTTP 200 OK . La réponse contient les données en cours de récupération :

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

Jetons hérités

Si vous utilisez toujours d'anciens jetons d'authentification Firebase, nous vous recommandons de mettre à jour votre authentification REST vers l'une des méthodes d'authentification décrites ci-dessus.

L'API REST Realtime Database prend toujours en charge l'authentification via des jetons d'authentification hérités, y compris les secrets . Les secrets de votre base de données en temps réel se trouvent dans la section Comptes de service de la console Firebase.

Les secrets sont des informations d’identification de longue durée. Nous vous recommandons de générer un nouveau secret et de révoquer celui existant lors de la suppression d'utilisateurs disposant d'un accès secret (tels que les propriétaires) d'un projet.