Autenticazione con JWT

L'API BigQuery accetta token web JSON (JWT) per autenticare le richieste.

Come best practice, devi utilizzare Credenziali predefinite dell'applicazione (ADC) per l'autenticazione in BigQuery. Se non puoi utilizzare ADC e utilizzi un account di servizio per l'autenticazione, puoi invece utilizzare un JWT firmato. I JWT consentono di effettuare una chiamata API senza una richiesta di rete al server di autorizzazione di Google.

Puoi utilizzare i JWT per l'autenticazione nei seguenti modi:

Pubblico

Per i JWT, viene utilizzata una rivendicazione del pubblico anziché un ambito. Per le API BigQuery, imposta il valore del segmento di pubblico su http://bigquery.googleapis.com/.

Creazione di JWT con librerie client

Per le chiavi degli account di servizio create nella console Google Cloud o utilizzando gcloud CLI, utilizza una libreria client che fornisca la firma JWT. Il seguente elenco fornisce alcune opzioni appropriate per i linguaggi di programmazione più diffusi:

Esempio Java

L'esempio seguente utilizza la libreria client di BigQuery per Java per creare e firmare un 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()));
    }
}

Crea JWT con REST o gcloud CLI

Per gli account di servizio gestiti dal sistema, devi assemblare manualmente il JWT, quindi utilizzare il metodo REST projects.serviceAccounts.signJwt o il comando Google Cloud CLI gcloud beta iam service-accounts sign-jwt per firmare il JWT. Per utilizzare uno di questi approcci, devi essere membro del ruolo Creatore token account di servizio Identity and Access Management.

Esempio della gcloud CLI

L'esempio seguente mostra uno script bash che assembla un JWT e poi utilizza il comando gcloud beta iam service-accounts sign-jwt per firmarlo.

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

Passaggi successivi