Google BigQuery認証とDataDirectによるJDBC接続

#はじめに

この記事では、DataDirect Google BigQuery JDBCコネクタがサポートするさまざまな認証を用いて、SQL／BI／ETLツールなどのあらゆるJDBC対応アプリケーションからリアルタイムにGoogle BigQueryへ接続する方法を記述します。

この記事では、以下の2タイプ認証について述べます。
１）サービスアカウントベース
２）OAuth 2.0

では、DataDirect Google BigQuery JDBCコネクタを使用する際に、これら2つの認証スキームを使ってどのように認証できるのか？を見てみます。

#サービスアカウントベース認証
1、Google Cloud Consoleにログインします。画面左上にあるメニューより、[IAMと管理]-[サービスアカウント]を選択します（下図参照）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/8539ddc9-0d7e-8ebd-7080-1e41d3672406.png)


２、サービスアカウントのページで、最上部の[サービスアカウントを作成]ボタンを押下します。サービスアカウントを生成するフォームが表示されるので、サービスアカウントの名前とID、説明をそれぞれ記入します。以下はサンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/b56009cb-7d37-10c9-05da-78cfc1d6db94.png)


３、[作成]を押下すると、サービスアカウントの権限を付与するためのオプションが表示されます。ドロップダウンボックスで[BigQuery]-[BigQuery 管理者]を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/223cd9f2-3fab-28d5-418e-47601412ff18.png)



４、[続行]を押下すると、次の画面で[鍵を作成]のオプションが表示されます。[鍵を作成]をクリックすると、jsonファイルと.p12キーファイルのどちらかを選択するメニューが画面右側に表示されます。どちらかを選択して[作成]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/b604b024-eef9-722f-1b4f-bfe59f382262.png)


５、選択した.jsonファイルまたは.p12ファイルのダウンロードが開始されますので、ファイルを保存してください。

６、DataDirect Google BigQuery JDBCコネクタを用いてGoogle BigQueryへ接続するには、以下のURLを使用します。

```console
jdbc:datadirect:googlebigquery:AuthenticationMethod=serviceaccount;Project=your-project-id;Dataset=your-dataset;ServiceAccountEmail=abc@projectid.iam.gserviceaccount.com;ServiceAccountPrivateKey=/path/to/json-key-file
```

変更が必要な箇所
Project：自分のプロジェクトID、Google Consoleで確認できます
DataSet：接続先のデータセット名
ServiceAccountEmail：上記2.と3.で生成したサービスアカウントIDです。[IAM]-[サービスアカウント]で確認できます
ServiceAccountPrivateKey：5.で保存したJSONまたは.p12ファイルのパス

７、以下の例を参考にしてください。

```console
jdbc:datadirect:googlebigquery:AuthenticationMethod=serviceaccount;Project=projectzero-249620;Dataset=datadirect;ServiceAccountEmail=googlebigquery@projectzero-249620.iam.gserviceaccount.com;ServiceAccountPrivateKey=C:\Users\sbobba\Downloads\projectzero-249620-215fa9911145.json
```

８、ご自身のJDBC対応ツールで上記のURLと一緒に使うと、Google BigQueryデータセット内の全てのデータを簡単にクエリできます。
 
#OAuth2.0認証

１、DataDirect Google BigQuery JDBC コネクタからGoogle BigQueryのデータへアクセスするために使えるもう１つの認証がOAuth2.0です。

２、DataDirect Google BigQuery JDBCコネクタでGoogle BigQueryへアクセスするために必要な情報は、アクセストークンとリフレッシュトークンの2つです。

３、アクセストークンとリフレッシュトークンを取得するには、以下を実行します。

１）クライアントIDとクライアントシークレットを取得するために、OAuthのクライアントIDを生成する
２）認証コードを取得するために、Googleに認証リクエストを送信する
３）Googleにトークンリクエストを送信して、アクセストークンとリフレッシュトークンを取得するために認証コードを交換する

４、OAuthクライアントIDの登録

１）新しいOAuthクライアントIDを登録するには、<a href="https://console.developers.google.com/" target="_blank">Google Developer Console</a>にログインします。

２）[OAuth 同意画面]タブでOAuthクライアントの詳細を入力します。

①アプリケーション名：自分のアプリケーション名
②サポートメール：自分もしくはサポートのメールアドレス
③Google APIのスコープ：
[スコープを追加]-[BigQuery API]で「../auth/bigquery」を追加
④承認済みドメイン：任意の一般向けwebサイト
⑤[アプリケーション ホームページ：任意の一般向けwebサイト
⑥[アプリケーション プライバシー ポリシー] リンク：プライバシーポリシー

３）以下の同意画面の例を参考にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/df0695d5-a6af-221e-456f-37f7d9d71cc7.png)


４）[保存]を押下します。

５）[認証情報]タブで[認証情報を作成]をクリックし、[OAuth Client ID]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/b729a40b-ef3f-8f85-55f6-7ee9f7326f37.png)



６）以下のようなアプリケーションの種類を尋ねる画面が表示されます。対象を選択（本例では[デスクトップアプリ]）を選択。名前を入力し、[作成]を押下してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/f8200342-db1c-64ab-ab31-7369cffdc8f0.png)


７）自分のクライアントIDとクライアントシークレットが入った新しいポップアップが表示されます。後で必要になりますので保存しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/ab719b57-96e0-c2ac-6264-6fa7bc622b93.png)



5、認証コードの取得
１）クライアントIDとクライアントシークレットを入手し、認証コードを取得するための認証リクエストをGoogleに送る準備ができました。

２）リクエストするするには、このURLをメモ帳にコピーし、クライアントIDを上記のステップで取得したもので書き換えます。

```console
https://accounts.google.com/o/oauth2/v2/auth?client_id=<;Your-client-Id> &redirect_uri=urn:ietf:wg:oauth:2.0:oob&state=GBQAUthTest&access_type=offline&scope=https://www.googleapis.com/auth/bigquery&response_type=code
```

３）URLの中のクライアントIDを書き換えたらURLをコピーし、ブラウザにペーストします。以下のページが表示されますので、自分のアカウントを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/adfa9447-d9fa-2500-d070-d9c1d10081b3.png)


４）アカウントを選択すると、アクセスを許可するかどうかを尋ねるポップアップが表示されます。[許可]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/0912d1b9-78a1-b88b-641e-ec3a8b47849b.png)


５）アプリケーションが検証されていない場合、警告が表示されます。[高度]をクリックすると、別のオプション[Go to <自分のアプリケーション名>]が表示されるのでクリックしてください。

６）OAuthクライアントにBigQueryデータへのアクセスを許可するか否か？を確認する画面が表示されるので、[許可]を押下します。

７）以下のように認証コードが入ったページが表示されます。コードをコピーして保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/fe98fa35-3744-2fd9-2a0e-c96881bd4abd.png)



６、アクセス、リフレッシュトークンの取得

１）認証コードを取得したので、アクセストークンとリフレッシュトークンを取得します。これは DataDirect BigQuery JDBC コネクタで Google BigQueryデータにアクセスする最後のステップです。

２）Postmanを開いて、Google OAuthトークンエンドポイントへPOSTリクエストを送信し、ClientID、Client Secret、Authorization CodeをAccess TokenとRefresh Tokenに交換します。

```console
POST https://www.googleapis.com/oauth2/v4/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
 
code=Your Authorization_code_from_step_17&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
grant_type=authorization_code
```

３）以下のような形でアクセストークンとリフレッシュトークンが返却されるので、保存してください。

```console
{
"access_token": "your-access-token",
"expires_in": 3600,
"refresh_token": "your-refresh-token",
"scope": "https://www.googleapis.com/auth/bigquery",
"token_type": "Bearer"
}
```

７、DataDirect Google BigQuery JDBCコネクタでデータアクセス

１）DataDirect Google BigQuery JDBCコネクタを使ってGoogle BigQueryへ接続するには、以下のURLを使用します。

```console
{
"access_token": "your-access-token",
"expires_in": 3600,
"refresh_token": "your-refresh-token",
"scope": "https://www.googleapis.com/auth/bigquery",
"token_type": "Bearer"
}
```

２）これでSQL／BI／ETLツールなどのJDBC対応アプリケーションからBigQueryにアクセスする準備ができました。


参考：<a href="https://www.ashisuto.co.jp/datadirect/connectors/google-bigquery.html" target="_blank">Google BigQueryデータとBIを標準SQLでシームレスに統合</a>