אימות באמצעות אסימוני JWT
BigQuery API מקבל אסימוני JWT (JSON Web Tokens) כדי לאמת בקשות.
השיטה המומלצת היא להשתמש ב-Application Default Credentials (ADC) כדי לאמת את BigQuery. אם אתם לא יכולים להשתמש ב-ADC ואתם משתמשים בחשבון שירות לאימות, אתם יכולים להשתמש ב-JWT חתום במקום זאת. אסימוני JWT מאפשרים לבצע קריאה ל-API בלי לשלוח בקשה לאחזור מהרשת לשרת האימות של Google.
אפשר להשתמש באסימוני JWT כדי לבצע אימות בדרכים הבאות:
- למפתחות של חשבונות שירות שנוצרו במסוף Google Cloud או באמצעות ה-CLI של gcloud, השתמשו בספריית לקוח שמספקת חתימת JWT.
- בחשבונות שירות שמנוהלים על ידי המערכת, צריך להשתמש ב-API בארכיטקטורת REST או ב-CLI של gcloud.
היקף וקהל
להשתמש בהיקפים עם חשבון שירות כשאפשר. אם זה לא אפשרי, אתם יכולים להשתמש בטענת קהל.
בממשקי ה-API של BigQuery, מגדירים את ערך הקהל ל-https://bigquery.googleapis.com/.
יצירת אסימוני JWT באמצעות ספריות לקוח
למפתחות של חשבונות שירות שנוצרו במסוף Google Cloud או באמצעות ה-CLI של gcloud, צריך להשתמש בספריית לקוח שמספקת חתימת JWT. ברשימה הבאה מפורטות כמה אפשרויות מתאימות לשפות תכנות פופולריות:
- Go: func JWTAccessTokenSourceFromJSON
- Java: Class ServiceAccountCredentials
- Node.js: Class JWTAccess
- PHP: ServiceAccountJwtAccessCredentials
- Python: מודול google.auth.jwt
- Ruby: Class: Google::Auth::ServiceAccountJwtHeaderCredentials
דוגמה ל-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 iam service-accounts sign-jwt ב-Google Cloud CLI כדי לחתום על ה-JWT. כדי להשתמש באחת מהגישות האלה, אתם צריכים להיות חברים בתפקיד יצירת אסימונים בחשבון שירות בניהול זהויות והרשאות גישה (IAM).
דוגמה ל-CLI של gcloud
בדוגמה הבאה מוצג סקריפט bash שיוצר JWT ואז משתמש בפקודה gcloud iam service-accounts sign-jwt כדי לחתום עליו.
#!/bin/bash
SA_EMAIL_ADDRESS="myserviceaccount@myproject."
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 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"