JWT で認証する
BigQuery API は、リクエストの認証に JSON Web Token(JWT)を受け入れます。
アプリケーションのデフォルト認証情報(ADC)を使用して BigQuery に対する認証を行うことをおすすめします。ADC を使用できず、サービス アカウントを認証に使用している場合は、代わりに署名付き JWT を使用できます。JWT を使用すると、Google の認可サーバーへのネットワーク リクエストなしで API 呼び出しを行うことができます。
JWT を使用して、次の方法で承認できます。
- Google Cloud コンソールで、または gcloud CLI を使用して作成されたサービス アカウント キーの場合は、JWT 署名を提供するクライアント ライブラリを使用します。
- システム管理サービス アカウントの場合は、REST API または gcloud CLI を使用します。
スコープとオーディエンス
可能な場合は、サービス アカウントでスコープを使用してください。スコープを使用できない場合は、オーディエンス クレームを使用できます。BigQuery API の場合は、オーディエンスの値を https://bigquery.googleapis.com/
に設定します。
クライアント ライブラリで JWT を作成する
Google Cloud コンソールで、または gcloud CLI を使用して作成されたサービス アカウント キーの場合は、JWT 署名を提供するクライアント ライブラリを使用します。以下に、一般的なプログラミング言語で利用できるオプションをいくつか紹介します。
- Go: func JWTAccessTokenSourceFromJSON
- Java: Class ServiceAccountCredentials
- Node.js: Class JWTAccess
- PHP: ServiceAccountJwtAccessCredentials
- Python: google.auth.jwt module
- Ruby: Class: Google::Auth::ServiceAccountJwtHeaderCredentials
Java の例
次の例では、Java 用 BigQuery クライアント ライブラリを使用して 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()));
}
}
REST または gcloud CLI で JWT を作成する
システム管理サービス アカウントの場合は、JWT を手動でアセンブルしてから、REST メソッド projects.serviceAccounts.signJwt
または Google Cloud CLI コマンド gcloud beta iam service-accounts sign-jwt
を使用して JWT に署名する必要があります。これらのいずれかの方法を使用するには、サービス アカウント トークン作成者の Identity and Access Management ロールのメンバーである必要があります。
gcloud CLI の例
次の例は、JWT をアセンブルしてから、gcloud beta iam service-accounts sign-jwt
コマンドを使用して署名する bash スクリプトを示したものです。
#!/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"
次のステップ
- BigQuery 認証の詳細を確認する。
- エンドユーザー認証情報で認証する方法を確認する。