S'authentifier avec des jetons JWT

L'API BigQuery accepte les jetons Web JSON (JWT) pour authentifier les requêtes.

Nous vous recommandons d'utiliser les identifiants par défaut de l'application (ADC) pour vous authentifier auprès de BigQuery. Si vous ne pouvez pas utiliser les identifiants par défaut de l'application et que vous utilisez un compte de service pour l'authentification, vous pouvez utiliser un jeton JWT signé à la place. Les jetons JWT vous permettent d'effectuer un appel d'API sans requête réseau vers le serveur d'autorisation de Google.

Vous pouvez utiliser des jetons JWT pour vous authentifier comme suit :

Champ d'application et audience

Utilisez des champs d'application avec le compte de service dans la mesure du possible. Sinon, vous pouvez utiliser une revendication d'audience. Pour les API BigQuery, définissez la valeur de l'audience sur https://bigquery.googleapis.com/.

Créer des jetons JWT avec des bibliothèques clientes

Pour les clés de compte de service créées dans la console Google Cloud ou à l'aide de la gcloud CLI, utilisez une bibliothèque cliente qui fournit une signature JWT. La liste suivante présente certaines options appropriées pour les langages de programmation courants :

Exemple Java

L'exemple suivant utilise la bibliothèque cliente BigQuery pour Java pour créer et signer un jeton JWT. Le champ d'application par défaut de l'API BigQuery est défini sur https://www.googleapis.com/auth/bigquery dans la bibliothèque cliente.

import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.common.collect.ImmutableList;

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

public class Example {
    public static void main(String... args) throws IOException {
        String projectId = "myproject";
        // Load JSON file that contains service account keys and create ServiceAccountCredentials object.
        String credentialsPath = "/path/to/key.json";
        ServiceAccountCredentials credentials = null;
        try (FileInputStream is = new FileInputStream(credentialsPath)) {
          credentials =  ServiceAccountCredentials.fromStream(is);
          // The default scope for BigQuery is used. 
          // Alternatively, use `.setScopes()` to set custom scopes.
          credentials = credentials.toBuilder()
              .setUseJwtAccessWithScope(true)
              .build();
        }
        // 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()));
    }
}

Créer des jetons JWT avec REST ou gcloud CLI

Pour les comptes de service gérés par le système, vous devez assembler manuellement le jeton JWT, puis utiliser la méthode REST projects.serviceAccounts.signJwt ou la commande gcloud beta iam service-accounts sign-jwt de Google Cloud CLI pour signer le jeton JWT. Pour utiliser l'une de ces approches, vous devez disposer du rôle IAM (Identity and Access Management) Créateur de jetons du compte de service.

Exemple gcloud CLI

L'exemple suivant présente un script bash qui assemble un jeton JWT, puis utilise la commande gcloud beta iam service-accounts sign-jwt pour le signer.

#!/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"

Étapes suivantes