Autenticar solicitações REST

Os SDKs do Firebase realizam todas as autenticações e a comunicação com o Firebase Realtime Database em seu nome. No entanto, quando você está em um ambiente sem um SDK do cliente ou caso queira evitar a sobrecarga de uma conexão de banco de dados permanente, você pode usar a Realtime Database REST API 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 do Google OAuth2: 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 código do Firebase: você também pode 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

Quaisquer informações publicamente passíveis de leitura ou gravação de acordo com suas Regras do Realtime Database também podem ser lidas e gravadas por meio da REST API sem a necessidade de autenticação. No entanto, se você quiser que seu servidor ignore essas regras, será preciso autenticar suas 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 Realtime Database REST API aceita tokens de acesso padrão do Google OAuth2. Os tokens de acesso podem ser gerados usando uma conta de serviço que tenha as permissões apropriadas para seu Realtime Database. Clique no botão Gerar nova chave privada na parte inferior da seção Contas de serviço do Console do Firebase para gerar facilmente um novo arquivo de chave de conta de serviço caso você ainda não tenha 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

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

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

Com 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 para a Realtime Database REST API, transmita o token de acesso do Google OAuth2 gerado acima como o cabeçalho Authorization: Bearer <ACCESS_TOKEN> ou o parâmetro de string de consulta access_token=<ACCESS_TOKEN>. Veja a seguir uma solicitação curl de exemplo para ler o nome "Ada":

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

Certifique-se de substituir <DATABASE_NAME> pelo nome do seu Realtime Database e <ACCESS_TOKEN> por um token de acesso do Google OAuth2.

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 código do Firebase

Quando um usuário ou dispositivo faz login usando o Firebase Authentication, o Firebase cria um token de código correspondente que identifica exclusivamente quem ou o quê se conectou e concede acesso a vários recursos, como o Realtime Database e o Cloud Storage. É possível usar esse token de código novamente para autenticar a Realtime Database REST API 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 para a Realtime Database REST API, transmita o token de código gerado acima como o parâmetro de string de consulta auth=<ID_TOKEN>. Veja a seguir uma solicitação curl de exemplo para ler o nome "Ada":

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

Certifique-se de substituir <DATABASE_NAME> pelo nome do seu Realtime Database e <ID_TOKEN> por um token de código 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 Realtime Database REST API ainda aceita autenticação por meio de tokens legados de autenticação, incluindo chaves secretas. Consulte a documentação legada (em inglês) para saber como usar esses tokens. Encontre suas chaves secretas do Realtime Database na seção Contas de serviço do Console do Firebase.

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.