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 :

Audience

Pour les jetons JWT, une revendication d'audience est utilisée à la place d'un champ d'application. 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 Google Cloud Console ou à l'aide de la CLI gcloud, 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.

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()));
    }
}

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