אימות באמצעות אסימוני JWT

‫BigQuery API מקבל אסימוני JWT (‏JSON Web Tokens) לאימות בקשות.

השיטה המומלצת היא להשתמש ב-Application Default Credentials‏ (ADC) כדי לבצע אימות ב-BigQuery. אם אתם לא יכולים להשתמש ב-ADC ואתם משתמשים בחשבון שירות לאימות, אתם יכולים להשתמש ב-JWT חתום במקום זאת. אסימוני JWT מאפשרים לבצע קריאה ל-API בלי לשלוח בקשה ברשת לשרת ההרשאות של Google.

אפשר להשתמש ב-JWT כדי לבצע אימות בדרכים הבאות:

היקף וקהל

כשאפשר, משתמשים בהיקפי גישה עם חשבון שירות. אם זה לא אפשרי, אפשר להשתמש בתלונה על הפרת זכויות יוצרים בקהל. ב-BigQuery APIs, מגדירים את ערך קהל היעד ל-https://bigquery.googleapis.com/.

יצירת אסימוני JWT באמצעות ספריות לקוח

למפתחות של חשבונות שירות שנוצרו במסוף Google Cloud או באמצעות ה-CLI של gcloud, צריך להשתמש בספריית לקוח שמספקת חתימה של JWT. ברשימה הבאה ריכזנו כמה אפשרויות מתאימות לשפות תכנות פופולריות:

דוגמה ל-Java

בדוגמה הבאה נעשה שימוש בספריית הלקוח של BigQuery ל-Java כדי ליצור ולחתום על JWT. ההיקף שמוגדר כברירת מחדל ל-BigQuery API הוא https://www.googleapis.com/auth/bigquery בספריית הלקוח.

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

יצירת JWT באמצעות REST או ה-CLI של gcloud

בחשבונות שירות שמנוהלים על ידי המערכת, צריך להרכיב את ה-JWT באופן ידני, ואז להשתמש בשיטת REST‏ projects.serviceAccounts.signJwt או בפקודה gcloud beta iam service-accounts sign-jwt של Google Cloud CLI כדי לחתום על ה-JWT. כדי להשתמש באחת מהגישות האלה, אתם צריכים להיות חברים בתפקיד יצירת אסימונים בחשבון שירות בניהול זהויות וגישה.

דוגמה ל-CLI של gcloud

בדוגמה הבאה מוצג סקריפט bash שמרכיב JWT ואז משתמש בפקודה gcloud beta iam service-accounts sign-jwt כדי לחתום עליו.

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

המאמרים הבאים