Mit JWTs authentifizieren

Die BigQuery API akzeptiert JSON Web Tokens (JWTs) zur Authentifizierung von Anfragen.

Als Best Practice sollten Sie Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC) zur Authentifizierung bei BigQuery verwenden. Wenn Sie keine ADC verwenden können und ein Dienstkonto zur Authentifizierung verwenden, können Sie stattdessen ein signiertes JWT verwenden. Mit JWTs können Sie einen API-Aufruf ohne Netzwerkanfrage an den Autorisierungsserver von Google ausführen.

Sie können JWTs auf folgende Arten für die Authentifizierung verwenden:

Umfang und Zielgruppe

Verwenden Sie nach Möglichkeit Bereiche mit dem Dienstkonto. Wenn dies nicht möglich ist, können Sie eine Zielgruppenanforderung verwenden. Legen Sie für die BigQuery APIs als Zielgruppenwert https://bigquery.googleapis.com/ fest.

JWTs mit Clientbibliotheken erstellen

Verwenden Sie für Dienstkontoschlüssel, die in der Google Cloud Console oder mithilfe der gcloud CLI erstellt wurden, eine Clientbibliothek, die JWT-Signaturen bereitstellt. Im Folgenden finden Sie einige geeignete Optionen für gängige Programmiersprachen:

Beispiel für Java

Im folgenden Beispiel wird die BigQuery-Clientbibliothek für Java verwendet, um ein JWT zu erstellen und zu signieren. Der Standardbereich für die BigQuery API ist in der Clientbibliothek auf https://www.googleapis.com/auth/bigquery festgelegt.

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

JWTs mit REST oder der gcloud CLI erstellen

Für vom System verwaltete Dienstkonten müssen Sie das JWT manuell zusammenstellen und dann die REST-Methode projects.serviceAccounts.signJwt oder den Google Cloud CLI-Befehl gcloud beta iam service-accounts sign-jwt verwenden, um das JWT zu signieren. Sie müssen Mitglied der Rolle Ersteller von Dienstkonto-Tokens für die Identitäts- und Zugriffsverwaltung sein, um so vorzugehen.

Beispiel für die gcloud CLI

Das folgende Beispiel zeigt ein Bash-Skript, das ein JWT zusammenstellt und dann mit dem Befehl gcloud beta iam service-accounts sign-jwt signiert.

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

Nächste Schritte