Autenticar solicitações REST

Os SDKs do Firebase cuidam de toda a autenticação e comunicação com o Firebase Realtime Database em seu nome. No entanto, quando você estiver em um ambiente que não tem um SDK cliente ou quiser evitar a sobrecarga de uma conexão persistente com o banco de dados, poderá usar a API REST do Realtime Database para ler e gravar dados.

Autentique usuários por meio de um dos seguintes métodos:

  1. Tokens de acesso Google OAuth2 - normalmente, a capacidade de ler e gravar no Realtime Database é regida pelas regras do Realtime Database . Porém, você pode acessar seus dados de um servidor e conceder a esse servidor acesso total de leitura e gravação aos seus dados com um token de acesso Google OAuth2 gerado a partir de uma conta de serviço.

  2. Tokens de ID do Firebase : você também pode enviar solicitações autenticadas como um usuário individual, como limitar o acesso com regras do Realtime Database nos SDKs do cliente. A API REST aceita os mesmos tokens de ID do Firebase usados ​​pelos SDKs do cliente.

Tokens de acesso Google OAuth2

Todos os dados que podem ser lidos ou gravados publicamente de acordo com as regras do Realtime Database também podem ser lidos e gravados por meio da API REST sem qualquer autenticação. No entanto, se quiser que seu servidor ignore as regras do Realtime Database, será necessário autenticar suas solicitações de leitura e gravação. A autenticação por meio do Google OAuth2 requer as seguintes etapas:

  1. Gere um token de acesso.
  2. Autentique-se com esse token de acesso.

Gerar um token de acesso

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

Depois de ter um arquivo de chave da conta de serviço, você poderá usar uma das bibliotecas cliente da API do Google para gerar um token de acesso OAuth2 do Google com os seguintes escopos necessários:

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

Aqui estão alguns exemplos de implementações que mostram como criar tokens de acesso Google OAuth2 para autenticação na API REST do Realtime Database em vários idiomas:

Node.js

Usando a biblioteca cliente da API 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

Usando a biblioteca cliente da API 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.

Pitão

Usando 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

Autenticar com um token de acesso

Para enviar solicitações autenticadas para a API REST do Realtime Database, transmita o token de acesso Google OAuth2 gerado acima como o cabeçalho Authorization: Bearer <ACCESS_TOKEN> ou o parâmetro de string de consulta access_token=<ACCESS_TOKEN> . Aqui está um exemplo de solicitação curl para ler o nome de 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 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 identificação do Firebase

Quando um usuário ou dispositivo faz login usando o Firebase Authentication, o Firebase cria um token de ID correspondente que o identifica exclusivamente e concede acesso a vários recursos, como Realtime Database e Cloud Storage. Você pode reutilizar esse token de ID para autenticar a API REST do Realtime Database e fazer solicitações em nome desse usuário.

Gerar um token de identificação

Para recuperar o token de ID do Firebase do cliente, siga as etapas em Recuperar tokens de ID em clientes .

Observe que os tokens de ID expiram após um curto período de tempo e devem ser usados ​​o mais rápido possível após serem recuperados.

Autenticar com um token de ID

Para enviar solicitações autenticadas para a API REST do Realtime Database, transmita o token de ID gerado acima como o parâmetro de string de consulta auth=<ID_TOKEN> . Aqui está um exemplo de solicitação curl para ler o nome de 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 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

Se você ainda usa tokens de autenticação legados do Firebase, recomendamos atualizar sua autenticação 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 . Seus segredos do Realtime Database podem ser encontrados na seção Contas de serviço do console do Firebase.

Os segredos são credenciais de longa duração. Recomendamos gerar um novo segredo e revogar o existente ao remover usuários com acesso secreto (como proprietários) de um projeto.