API リクエストの承認

BigQuery API は、OAuth 2.0 アクセス トークンまたは JSON Web Token(JWT)を使用してリクエストを承認します。これらのトークンは、API への一時的なアクセスを許可します。

可能であれば、アプリケーションでアプリケーションのデフォルト認証情報(ADC)を使用して、OAuth 2.0 や JWT などの既知のソースから認証情報を探し出す必要があります。詳細については、認証情報の自動検出をご覧ください。

ADC を使用できない場合は、Google の OAuth 2.0 サーバーを使用して OAuth 2.0 アクセス トークンを取得します。または、認証にサービス アカウントを使用している場合には、代わりに、署名付き JWT を使用できます。JWT を使用すると、API 呼び出しを行う前に Google の認証サーバーにネットワーク リクエストを行うのを回避できます。

始める前に

OAuth 2.0 で認証する

このセクションでは、OAuth 2.0 アクセス トークンを BigQuery API に提供する方法について説明します。BigQuery クライアント ライブラリを使用している場合は、自動的に行われるため、この情報は必要ありません。

スコープ

アクセス トークンはスコープに関連付けられています。それは、トークンのアクセスに対する制限です。BigQuery API に関連するスコープについては、Google API スコープのリストをご覧ください。

アクセス トークンを取得する

アプリケーションのデフォルト認証情報を使用して、一時アクセス トークンを取得します。

コマンドライン

Google Cloud CLI を使用してアクセス トークンを出力します。

ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"

他の環境でアクセス トークンを取得する方法については、認証ガイドをご覧ください。

アクセス トークンが提供するのは一時的な承認のみなので、定期的に更新する必要があります。

リクエストの承認

アクセス トークンを使用して BigQuery API へのリクエストを承認するには、OAuth 2.0 トークンの使用方法のいずれかを使用します。

リクエスト ヘッダー

Authorization リクエスト ヘッダーの中のトークンに、値 Bearer ACCESS_TOKEN を設定します。

コマンドライン

curl -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://www.googleapis.com/bigquery/v2/projects/$GOOGLE_CLOUD_PROJECT/datasets"

JWT で認証する

JWT を使用して、次の方法で承認できます。

オーディエンス

JWT の場合、スコープの代わりにオーディエンス クレームが使用されます。BigQuery API の場合は、オーディエンスの値を https://bigquery.googleapis.com/ に設定します。

クライアント ライブラリで JWT を作成する

Google Cloud コンソールで、または gcloud CLI を使用して作成されたサービス アカウント キーの場合は、JWT 署名を提供するクライアント ライブラリを使用します。以下に、一般的なプログラミング言語で利用できるオプションをいくつか紹介します。

Java の例

次の例では、Java 用 BigQuery クライアント ライブラリを使用して JWT を作成、署名します。

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

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"

次のステップ

  • プログラムによって OAuth 2.0 アクセス トークンを取得する方法を認証ガイドで学習する。