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:

Zielgruppe

Für JWTs wird anstelle eines Bereichs eine Zielgruppenanforderung verwendet. 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.

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

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="[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": "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