Autentica solicitudes de REST

Los SDK de Firebase controlan toda la autenticación y la comunicación con Firebase Realtime Database por ti. Sin embargo, cuando usas un entorno que no tiene un SDK de cliente o deseas evitar la sobrecarga de una conexión continua a la base de datos, puedes usar la API de REST de Realtime Database para leer y escribir datos.

Autentica usuarios a través de uno de los métodos siguientes:

  1. Tokens de acceso de Google OAuth2: Por lo general, la capacidad de leer y escribir en Realtime Database se rige por las reglas de Realtime Database. Sin embargo, puedes acceder a los datos desde un servidor y concederle acceso completo de lectura y escritura a tus datos a ese servidor con un token de acceso de Google OAuth2 generado desde una cuenta de servicio.

  2. Tokens de ID de Firebase: También puedes enviar solicitudes autenticadas como un usuario individual, por ejemplo, limitar el acceso con reglas de Realtime Database en los SDK de cliente. La API de REST acepta los mismos tokens de ID de Firebase que usan los SDK de cliente.

Tokens de acceso de Google OAuth2

Cualquier dato con acceso público de lectura o escritura de acuerdo con las reglas de Realtime Database también se podrá leer o escribir a través de la API de REST sin ninguna autenticación. Sin embargo, si deseas que tu servidor omita las reglas de Realtime Database, debes autenticar las solicitudes de lectura y escritura. Para utilizar la autenticación a través de Google OAuth2, debes seguir estos pasos:

  1. Genera un token de acceso.
  2. Autentica con ese token de acceso.

Genera un token de acceso

La API de REST de Realtime Database acepta los tokens de acceso estándar de Google OAuth2. Se pueden generar los tokens de acceso con una cuenta de servicio que posea los permisos adecuados para Realtime Database. Hacer clic en el botón Generar nueva clave privada, que se encuentra en la parte inferior de la sección Cuentas de servicio de Firebase console te permite generar fácilmente un archivo de claves de cuenta de servicio en caso de que no tengas uno.

Cuando tengas un archivo de clave de cuenta de servicio, puedes usar una de las bibliotecas cliente de la API de Google para generar un token de acceso de Google OAuth2 con los siguientes alcances obligatorios:

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

Las siguientes implementaciones de ejemplo muestran cómo crear tokens de acceso de Google OAuth2 para autenticar en la API de REST de Realtime Database en diferentes lenguajes:

Node.js

Uso de la biblioteca cliente de la API de Google para 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

Uso de la biblioteca cliente de la API de Google para 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

Uso de la biblioteca 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

Autentica con un token de acceso

Para enviar solicitudes autenticadas a la API de REST de Realtime Database, pasa el token de acceso de Google OAuth2 generado anteriormente como el encabezado Authorization: Bearer <ACCESS_TOKEN> o el parámetro de la cadena de consulta access_token=<ACCESS_TOKEN>. Esta es una solicitud curl de ejemplo para leer el nombre de Ada:

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

Asegúrate de reemplazar <DATABASE_NAME> por el nombre de Realtime Database y <ACCESS_TOKEN> por un token de acceso de Google OAuth2.

Una solicitud exitosa se indicará con un código de estado HTTP 200 OK. La respuesta contiene los datos que se recuperan:

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

Tokens de ID de Firebase

Cuando un usuario o dispositivo accede con Firebase Authentication, Firebase crea un token de ID correspondiente que lo identifica de forma única y le otorga acceso a varios recursos, como Realtime Database y Cloud Storage. Puedes volver a usar ese token de ID para autenticar la API de REST de Realtime Database y hacer solicitudes en nombre de ese usuario.

Genera un token de ID

Para recuperar el token de ID de Firebase desde el cliente, sigue los pasos que se indican en Recupera tokens de ID en los clientes.

Ten en cuenta que los tokens de ID vencen después de un plazo corto y se deben usar lo más rápido posible después de recuperarlos.

Autentica con un token de ID

Para enviar solicitudes autenticadas a la API de REST de Realtime Database, pasa el token de ID que se generó anteriormente como el parámetro de la cadena de consulta auth=<ID_TOKEN>. Esta es una solicitud curl de ejemplo para leer el nombre de Ada:

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

Asegúrate de reemplazar <DATABASE_NAME> por el nombre de Realtime Database y <ID_TOKEN> por un token de ID de Firebase.

Una solicitud exitosa se indicará con un código de estado HTTP 200 OK. La respuesta contiene los datos que se recuperan:

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

Tokens heredados

Si todavía usas tokens de autenticación de Firebase heredados, te recomendamos que actualices la autenticación de REST a uno de los métodos de autenticación descritos anteriormente.

La API de REST de Realtime Database aún admite la autenticación a través de los tokens de autenticación heredados, incluidos los secretos. Puedes encontrar tus secretos de Realtime Database en la sección Cuentas de servicio de Firebase console.

Los secretos son credenciales de larga duración. Te recomendamos que generes un secreto nuevo y revoques el existente cuando quites a los usuarios con acceso secreto (como los propietarios) de un proyecto.