Autenticar solicitações REST

Os SDKs do Firebase processam todas as autenticações e comunicações com o Firebase Realtime Database em seu nome. No entanto, quando você está em um ambiente sem um SDK do cliente ou quer evitar a sobrecarga de uma conexão de banco de dados permanente, é possível usar a API REST do Realtime Database para ler e gravar dados.

Faça a autenticação de usuários de acordo com um dos métodos a seguir:

  1. Tokens de acesso OAuth2 do Google: normalmente, a capacidade de realizar leituras e gravações no Realtime Database é regida pelas regras do Realtime Database. Porém, você pode acessar suas informações a partir de um servidor e conceder a ele acesso completo de leitura e gravação dos seus dados. Para isso, use um token de acesso do Google OAuth2 gerado a partir de uma conta de serviço.

  2. Tokens de ID do Firebase: também é possível enviar solicitações autenticadas como um usuário individual, por exemplo, ao usar as regras do Realtime Database para limitar o acesso aos SDKs do cliente. A REST API aceita os mesmos tokens de código do Firebase usados pelos SDKs do cliente.

Tokens de acesso do Google OAuth2

Os dados que podem ser lidos e gravados de maneira pública de acordo com as regras do Realtime Database também podem ser lidos e gravados por meio da API REST sem a necessidade de autenticação. No entanto, se você quiser que o servidor ignore essas regras do Realtime Database, será preciso autenticar as solicitações de leitura e gravação. Para fazer a autenticação pelo Google OAuth2, siga estas etapas:

  1. Gere um token de acesso.
  2. Faça a autenticação com esse token.

Gerar um token de acesso

A API REST do Realtime Database aceita tokens de acesso OAuth2 padrão do Google. Os tokens de acesso podem ser gerados usando uma conta de serviço com as permissões adequadas para o Realtime Database. Clique no botão Gerar chave privada na parte inferior da seção Contas de serviço do console do Firebase para gerar facilmente um novo arquivo de chave da conta de serviço, se você ainda não tiver um.

Assim que você tiver um arquivo de chave de conta de serviço, use uma das bibliotecas de cliente das APIs do Google para gerar um token de acesso do Google OAuth2 com os seguintes escopos necessários:

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

Confira aqui algumas implementações de exemplo que mostram como criar tokens de acesso OAuth2 do Google para fazer a autenticação na API REST do Realtime Database em diversas linguagens:

Node.js

Como usar a biblioteca de cliente das APIs do 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

Como usar a biblioteca de cliente das APIs do 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

Como usar a 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

Fazer a autenticação com um token de acesso

Para enviar solicitações autenticadas à API REST do Realtime Database, transmita o token de acesso OAuth2 do Google gerado acima como o cabeçalho de Authorization: Bearer <ACCESS_TOKEN> ou o parâmetro de string de consulta access_token=<ACCESS_TOKEN>. Confira um exemplo de solicitação curl para ler o nome Ada:

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

Substitua <DATABASE_NAME> pelo nome do Realtime Database e <ACCESS_TOKEN> por um token de acesso OAuth2 do Google.

Uma solicitação bem-sucedida será indicada por um código de status HTTP 200 OK. A resposta contém os dados que estão sendo recuperados:

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

Tokens de ID do Firebase

Quando um usuário ou dispositivo faz login usando o Firebase Authentication, o Firebase cria um token de ID correspondente que os identifica de maneira exclusiva e concede a eles acesso a vários recursos, como o Realtime Database e o Cloud Storage. É possível usar esse token de ID novamente para autenticar a API REST do Realtime Database e fazer solicitações em nome desse usuário.

Gerar um token de código

Para recuperar do cliente o token de código do Firebase, siga as etapas em Recuperar tokens de códigos de clientes.

Observe que esses tokens expiram em pouco tempo. Por isso, eles devem ser usados o mais rápido possível após terem sido recuperados.

Fazer a autenticação com um token de código

Para enviar solicitações autenticadas à API REST do Realtime Database, transmita o token de ID gerado acima como o parâmetro de string de consulta auth=<ID_TOKEN>. Confira um exemplo de solicitação curl para ler o nome Ada:

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

Substitua <DATABASE_NAME> pelo nome do Realtime Database e <ID_TOKEN> por um token de ID do Firebase.

Uma solicitação bem-sucedida será indicada por um código de status HTTP 200 OK. A resposta contém os dados que estão sendo recuperados:

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

Tokens legados

Caso ainda esteja usando tokens legados de autenticação do Firebase, recomendamos que você atualize sua autenticação da REST para um dos métodos de autenticação descritos acima.

A API REST do Realtime Database ainda oferece suporte à autenticação por meio de tokens de autenticação legados, incluindo secrets. Encontre os secrets do Realtime Database na seção Contas de serviço do console do Firebase.

Os secrets são credenciais de longa duração. Recomendamos gerar um secret novo e revogar o atual ao remover usuários com acesso a ele (como proprietários) de um projeto.