Autenticar solicitudes REST

Los SDK de Firebase manejan toda la autenticación y comunicación con Firebase Realtime Database en su nombre. Sin embargo, cuando se encuentra en un entorno que no tiene un SDK de cliente o desea evitar la sobrecarga de una conexión de base de datos persistente, puede utilizar la API REST de Realtime Database para leer y escribir datos.

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

  1. Tokens de acceso de Google OAuth2 : normalmente, la capacidad de leer y escribir en la base de datos en tiempo real se rige por las reglas de la base de datos en tiempo real . Sin embargo, puede acceder a sus datos desde un servidor y otorgarle a ese servidor acceso completo de lectura y escritura a sus datos con un token de acceso Google OAuth2 generado a partir de una cuenta de servicio.

  2. Tokens de ID de Firebase : es posible que también desee enviar solicitudes autenticadas como un usuario individual, como limitar el acceso con reglas de bases de datos en tiempo real en los SDK del cliente. La API REST acepta los mismos tokens de ID de Firebase que utilizan los SDK del cliente.

Tokens de acceso de Google OAuth2

Cualquier dato que se pueda leer o escribir públicamente de acuerdo con las reglas de la base de datos en tiempo real también se puede leer y escribir a través de la API REST sin ninguna autenticación. Sin embargo, si desea que su servidor omita las reglas de la base de datos en tiempo real, debe autenticar sus solicitudes de lectura y escritura. La autenticación a través de Google OAuth2 requiere los siguientes pasos:

  1. Generar un token de acceso.
  2. Autentíquese con ese token de acceso.

Generar un token de acceso

La API REST de Realtime Database acepta tokens de acceso estándar de Google OAuth2 . Los tokens de acceso se pueden generar utilizando una cuenta de servicio con los permisos adecuados para su base de datos en tiempo real. Hacer clic en el botón Generar nueva clave privada en la parte inferior de la sección Cuentas de servicio de Firebase console le permite generar fácilmente un nuevo archivo de clave de cuenta de servicio si aún no tiene uno.

Una vez que tenga un archivo de clave de cuenta de servicio, puede usar una de las bibliotecas cliente API de Google para generar un token de acceso OAuth2 de Google con los siguientes alcances requeridos:

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

A continuación se muestran algunos ejemplos de implementaciones que muestran cómo crear tokens de acceso OAuth2 de Google para autenticarse en la API REST de Realtime Database en una variedad de idiomas:

Nodo.js

Usando la biblioteca cliente 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

Usando la biblioteca cliente 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.

Pitón

Usando 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

Autenticarse con un token de acceso

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

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

Asegúrese de reemplazar <DATABASE_NAME> con el nombre de su base de datos en tiempo real y <ACCESS_TOKEN> con un token de acceso OAuth2 de Google.

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

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

Fichas de identificación de Firebase

Cuando un usuario o dispositivo inicia sesión mediante Firebase Authentication, Firebase crea un token de identificación correspondiente que lo identifica de forma única y le otorga acceso a varios recursos, como Realtime Database y Cloud Storage. Puede reutilizar ese token de ID para autenticar la API REST de Realtime Database y realizar solicitudes en nombre de ese usuario.

Generar un token de identificación

Para recuperar el token de ID de Firebase del cliente, sigue los pasos en Recuperar tokens de ID en clientes .

Tenga en cuenta que los tokens de identificación caducan después de un corto período de tiempo y deben usarse lo más rápido posible después de recuperarlos.

Autenticarse con un token de identificación

Para enviar solicitudes autenticadas a la API REST de Realtime Database, pase el token de ID generado anteriormente como parámetro de cadena de consulta auth=<ID_TOKEN> . Aquí hay un ejemplo de solicitud curl para leer el nombre de Ada:

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

Asegúrese de reemplazar <DATABASE_NAME> con el nombre de su base de datos en tiempo real y <ID_TOKEN> con 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 están recuperando:

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

Fichas heredadas

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

La API REST de Realtime Database aún admite la autenticación mediante tokens de autenticación heredados, incluidos los secretos . Los secretos de su base de datos en tiempo real se pueden encontrar en la sección Cuentas de servicio de Firebase console.

Los secretos son credenciales duraderas. Recomendamos generar un nuevo secreto y revocar el existente al eliminar usuarios con acceso secreto (como propietarios) de un proyecto.