CData Snowflake Drivers でOAuth 認証を行う

by 浦邊信太郎 | 2022年09月09日

本記事ではCData Snowflake Drivers で、Snowflake への接続時にOAuth 認証を行う方法を紹介します。

CData Snowflake Drivers はSnowflake がサポートする様々な認証方式が使用できます。このうち「OAuth 認証」はOAuth 2.0 プロトコルを使用した認証方式です。

OAuth 認証はSnowflake の「統合 (Integration)」を利用します。統合とはSnowflake と他サービスとを連携するためのSnowflake オブジェクトで、OAuth 認証では「セキュリティ統合」を使用します (他の統合としてはクラウドストレージにアクセスする「ストレージ統合」などがあります)。

ドライバーからの接続時にはセキュリティ統合に紐づけられたOAuth クライアントID / シークレットの情報が必要です。すでにSnowflake にセキュリティ統合を作成している場合はそれらの値を取得します。今回はセキュリティ統合がない場合を想定し、統合の作成から説明します。

セキュリティ統合の作成

セキュリティ統合を作成するにはcreate security integration 句を使用します。

create security integration <統合の名前>
type = oauth
enabled = true
oauth_client = custom
oauth_client_type = 'CONFIDENTIAL'
oauth_redirect_uri = <リダイレクトURL>
oauth_issue_refresh_tokens = true;

上記SQL をACCOUNTADMIN 権限で実行します。

SQL 例

以下のSQL ではリダイレクトURL に「https://localhost:33333」を指定し、「TEST_OAUTH」という名前でセキュリティ統合を作成します。

create security integration TEST_OAUTH
type = oauth
enabled = true
oauth_client = custom
oauth_client_type = 'CONFIDENTIAL'
oauth_redirect_uri = 'https://localhost:33333'
oauth_issue_refresh_tokens = true;


統合の作成に成功すると以下のメッセージが返ってきます。

クライアントID / シークレットの取得

続いて作成した統合のOAuth クライアントID とOAuth シークレットを取得します。
統合作成時と同様にACCOUNTADMIN 権限で以下のクエリを実行してください。

select system$show_oauth_client_secrets('<統合名>');

SQL 例

以下のSQL では「TEST_OAUTH」という統合名の値を取得します。

select system$show_oauth_client_secrets('TEST_OAUTH');

上記SQL を実行すると以下のような値が取得できます。OAUTH_CLIENT_SECRET (OAuthクライアントシークレット)、OAUTH_CLIENT_ID (OAuth クライアントID)の二つの値が認証に必要な情報となります。

{"OAUTH_CLIENT_SECRET_2":"ZVtYbSWCwdFlPIJp9/N9n8O8ICrBKfzgGeLwRS3SeZw=","OAUTH_CLIENT_SECRET":"sqtLcNhIgNphCdjJK+Q+U1rdUGwclG1T0BSmXZSI2Rs=","OAUTH_CLIENT_ID":"l+qjwKzs7NWDzXbs1Kc/csJpAXU="}

統合作成時に指定したリダイレクトURL, 統合から取得したOAuth クライアントID, OAuth クライアントシークレットの3つが認証に必要な値となります。これらの値は適宜控えておいてください。

リダイレクトURL : https://localhost:33333
OAuth クライアントID : l+qjwKzs7NWDzXbs1Kc/csJpAXU=
OAuth クライアントシークレット : sqtLcNhIgNphCdjJK+Q+U1rdUGwclG1T0BSmXZSI2Rs=


その他統合関連操作

統合一覧の表示

統合名を忘れた際などには以下のSQL で作成した統合の一覧が取得できます。

show integrations;

以下のように統合名を部分検索することもできます。

show integrations like <統合名%>

統合の削除

統合を削除する場合は以下のSQL を実行してください。

drop integration <統合名>;

統合が存在しない場合にエラーを発生させたくない場合は以下のようにIF EXISTS 句を使用します。

drop integration if exists <統合名>;

CData Snowflake Drivers でのOAuth 認証の設定

ドライバーでOAuth 認証を行うには、AuthSchem プロパティを「OAuth」に設定し、認証に必要な情報を設定します。以下にOAuth 認証に必要なプロパティを示します。

プロパティ名 説明
Url SnowflakeのURL
Warehouse 接続先Warehouse
AuthScheme 「OAuth」を設定
InitiateOAuth 「GETANDREFRESH」を設定
CallbackUrl OAuth 統合作成時に設定したリダイレクトURL
OAuthClientId OAuth 統合のOAuth クライアントID
OAuthClientSecret OAuth 統合のOAuth クライアントシークレット

CData Snowflake JDBC / ODBC Driverでの設定例

JDBC Driver の接続文字列の例を以下に示します。

jdbc:snowflake:InitiateOAuth=GETANDREFRESH;Url=https://xxxxx.us-east-1.snowflakecomputing.com;Warehouse=TEST_WAREHOUSE;AuthScheme=OAuth;CallbackUrl=https://localhost:33333;OAuthClientId="l+qjwKzs7NWDzXbs1Kc/csJpAXU=";OAuthClientSecret="sqtLcNhIgNphCdjJK+Q+U1rdUGwclG1T0BSmXZSI2Rs=";

ODBC Driver のDSN 設定例を以下に示します。

CallbackUrl は[詳細]タブで設定してください。

接続プロパティの設定後にドライバーを使用すると、初回接続時にブラウザが起動しSnowflake へのログイン画面が表示されます。この画面でユーザ名とパスワードを指定してログインするとドライバーはOAuth アクセストークンを取得し、暗号化された状態でローカルのファイルシステムに保存します。

以降のドライバー使用時には保存されたOAuth アクセストークンで接続を行うため、認証画面が表示されることなく接続されます。

おわりに

今回はCData Snowflake Drivers でOAuth 認証を行う方法を説明しました。CData Snowflake Drivers は30日間無料でお使いいただけます。Snowflake との連携をご検討の方はぜひお試しください。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。