Autenticar com JWTs

A API BigQuery aceita JSON Web Tokens (JWTs) para autenticar solicitações.

Como prática recomendada, use o Application Default Credentials (ADC) para autenticação no BigQuery. Se não for possível usar o ADC e você estiver usando uma conta de serviço para autenticação, use um JWT assinado. Os JWTs permitem que você faça uma chamada de API sem uma solicitação de rede para o servidor de autorização do Google.

É 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 http://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("http://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="[email protected]"

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": "http://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 \
"http://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets?alt=json"

A seguir