Como autorizar solicitações de API

A API BigQuery usa tokens de acesso OAuth 2.0 ou JSON Web Tokens (JWTs) para autorizar solicitações. Esses tokens concedem acesso temporário a uma API.

Quando possível, use o Application Default Credentials (ADC) no seu aplicativo para descobrir credenciais de fontes conhecidas, incluindo o OAuth 2.0 e o JWTs. Para mais informações, consulte Como encontrar credenciais automaticamente.

Se você não puder usar o ADC, use o servidor OAuth 2.0 do Google para conseguir um token de acesso do OAuth 2.0 ou, se estiver usando uma conta de serviço para autenticação, será possível usar um JWT assinado. Usar um JWT permite que você evite fazer uma solicitação de rede para o servidor de autorização do Google antes de fazer uma chamada de API.

Antes de começar

Autenticar com o OAuth 2.0

Nesta seção, mostramos como fornecer um token de acesso do OAuth 2.0 para a API BigQuery. Se você usar as bibliotecas de cliente do BigQuery, essas informações não serão necessárias, já que isso será feito automaticamente.

Escopos

Os tokens de acesso são associados a um escopo, o que limita o acesso do token. Verifique a lista completa de escopos da API do Google (em inglês) para ver os escopos associados à API BigQuery.

Receber tokens de acesso

Receba um token de acesso temporário usando o Application Default Credentials.

Linha de comando

Use a CLI Google Cloud para imprimir um token de acesso.

ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"

Consulte o guia de autenticação para saber como conseguir um token de acesso em outros ambientes.

Como os tokens de acesso oferecem autorização apenas temporária, você precisa atualizá-los periodicamente.

Autorizar solicitações

Para autorizar solicitações à BigQuery API com um token de acesso, use qualquer um dos métodos de uso do token OAuth 2.0.

Cabeçalho da solicitação

Defina o token no cabeçalho da solicitação Authorization com o valor Bearer ACCESS_TOKEN.

Linha de comando

curl -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://www.googleapis.com/bigquery/v2/projects/$GOOGLE_CLOUD_PROJECT/datasets"

Autenticar com JWTs

É possível usar JWTs para autenticação das seguintes maneiras:

Público-alvo

Para JWTs, uma declaração de público-alvo é usada em vez de um escopo. Para as APIs do BigQuery, defina o valor de público-alvo como https://bigquery.googleapis.com/.

Criar JWTs com bibliotecas de cliente

Para chaves de conta de serviço criadas no Console do Google Cloud ou com a CLI gcloud, use uma biblioteca de cliente que forneça assinatura JWT. A lista a seguir fornece algumas opções apropriadas para linguagens de programação conhecidas:

Exemplo do Java

No exemplo a seguir, usamos a biblioteca de cliente do BigQuery para Java para criar e assinar um JWT.

import com.google.auth.Credentials;
import com.google.auth.oauth2.ServiceAccountJwtAccessCredentials;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;

import java.io.FileInputStream;
import java.net.URI;

public class Example {
    public static void main(String... args) throws Exception {
        String projectId = "myproject";
        // Load JSON file that contains service account keys and create ServiceAccountJwtAccessCredentials object.
        String credentialsPath = "/path/to/key.json";
        URI audience = URI.create("https://bigquery.googleapis.com/");
        Credentials credentials = null;
        try (FileInputStream is = new FileInputStream(credentialsPath)) {
            credentials = ServiceAccountJwtAccessCredentials.fromStream(is, audience);
        }
        // Instantiate BigQuery client with the credentials object.
        BigQuery bigquery =
                BigQueryOptions.newBuilder().setCredentials(credentials).build().getService();
        // Use the client to list BigQuery datasets.
        System.out.println("Datasets:");
        bigquery
            .listDatasets(projectId)
            .iterateAll()
            .forEach(dataset -> System.out.printf("%s%n", dataset.getDatasetId().getDataset()));
    }
}

Criar JWTs com REST ou a CLI gcloud

Para contas de serviço gerenciadas pelo sistema, é necessário montar o JWT manualmente e usar o método REST projects.serviceAccounts.signJwt ou o comando da Google Cloud CLI gcloud beta iam service-accounts sign-jwt para assinar o JWT. Para usar uma dessas abordagens, é preciso ser membro do papel de criador de tokens da conta de serviço de gerenciamento de identidade e acesso.

Exemplo da CLI gcloud

O exemplo a seguir mostra um script bash que monta um JWT e usa o comando gcloud beta iam service-accounts sign-jwt para assiná-lo.

#!/bin/bash

SA_EMAIL_ADDRESS="myserviceaccount@myproject.iam.gserviceaccount.com"

TMP_DIR=$(mktemp -d /tmp/sa_signed_jwt.XXXXX)
trap "rm -rf ${TMP_DIR}" EXIT
JWT_FILE="${TMP_DIR}/jwt-claim-set.json"
SIGNED_JWT_FILE="${TMP_DIR}/output.jwt"

IAT=$(date '+%s')
EXP=$((IAT+3600))

cat <<EOF > $JWT_FILE
{
  "aud": "https://bigquery.googleapis.com/",
  "iat": $IAT,
  "exp": $EXP,
  "iss": "$SA_EMAIL_ADDRESS",
  "sub": "$SA_EMAIL_ADDRESS"
}
EOF

gcloud beta iam service-accounts sign-jwt --iam-account $SA_EMAIL_ADDRESS $JWT_FILE $SIGNED_JWT_FILE

echo "Datasets:"
curl -L -H "Authorization: Bearer $(cat $SIGNED_JWT_FILE)" \
-X GET \
"https://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets?alt=json"

A seguir