コンシューマーからの OAuth 認証リクエスト

このトピックでは、 SECRET_AUTHORIZATION 構成タイプを使用して Snowflake Native App で OAuth 認証コード付与フローを有効にする方法について説明します。これは、 Request OAuth connection で説明されている AUTHORIZATION_CODE セキュリティ統合型に特化したフローです。

概要

一部の Snowflake Native Apps では、アプリが代わりに外部リソースにアクセスする前に、サードパーティのサービスでコンシューマーに認証する必要があります。認証コード付与フローにより、コンシューマーはアプリのプロバイダーと認証情報を共有することなく、直接 OAuth 認証を完了できます。

プロバイダーは、アプリのセットアップスクリプトで OAuth 統合とシークレットを構成します。その後、コンシューマーは接続を承認するための標準 OAuth 同意フローを完了します。コンシューマーが認証を完了すると、アプリは生成されたトークンを使用して外部リソースにアクセスできます。

プロバイダーのセットアップ

ステップ1:セキュリティ統合を作成する

認証コード付与フローを使用して API_AUTHENTICATION 型のセキュリティ統合を作成します。詳細については、 CREATE SECURITY INTEGRATION (外部 API 認証) をご参照ください。

CREATE SECURITY INTEGRATION oauth_integration
  TYPE = API_AUTHENTICATION
  AUTH_TYPE = OAUTH2
  OAUTH_CLIENT_AUTH_METHOD = CLIENT_SECRET_POST
  OAUTH_CLIENT_ID = '<client_id>'
  OAUTH_CLIENT_SECRET = '<client_secret>'
  OAUTH_GRANT = 'AUTHORIZATION_CODE'
  OAUTH_TOKEN_ENDPOINT = 'https://provider.example.com/oauth2/token'
  OAUTH_AUTHORIZATION_ENDPOINT = 'https://provider.example.com/oauth2/authorize'
  ENABLED = TRUE;

ステップ2:シークレットを作成

セキュリティ統合にリンクされたシークレットを作成します。

CREATE SECRET app_schema.oauth_secret
  TYPE = oauth2
  API_AUTHENTICATION = oauth_integration;

ステップ3:アプリ仕様の作成

コンシューマーが OAuth 接続の詳細を確認して承認できるように、セキュリティ統合のアプリ仕様を作成します。詳細については、 Request OAuth connection をご参照ください。

ALTER APPLICATION SET SPECIFICATION oauth_spec
  TYPE = SECURITY_INTEGRATION
  LABEL = 'OAuth connection to external provider'
  DESCRIPTION = 'Connects to external provider using Authorization Code grant'
  OAUTH_TYPE = 'AUTHORIZATION_CODE'
  OAUTH_TOKEN_ENDPOINT = 'https://provider.example.com/oauth2/token'
  OAUTH_AUTHORIZATION_ENDPOINT = 'https://provider.example.com/oauth2/authorize';

アプリの仕様を承認すると、コンシューマーは OAuth 接続メタデータを承認できますが、認証は完了しません。コンシューマーは コンシューマー認証 で説明されている OAuth フローも完了する必要があります。これは、ステップ5で作成した構成によって駆動されます。

ステップ4:アプリケーションロールに OAuth フローを完了するためのアクセスを付与します

アクセスを必要とするアプリケーションロールのセキュリティ統合に USAGE を付与し、シークレットに MODIFY を付与します。

GRANT USAGE ON INTEGRATION oauth_integration TO APPLICATION ROLE app_user;
GRANT MODIFY ON SECRET app_schema.oauth_secret TO APPLICATION ROLE app_user;

これらの付与がないと、コンシューマーは OAuth フローを完了できず、追加のコンテキストなしで権限エラーが発生する場合があります。

ステップ5:SECRET_AUTHORIZATION 構成を作成する

コンシューマー側の OAuth フローを調整する SECRET_AUTHORIZATION 構成を作成します

ALTER APPLICATION SET CONFIGURATION DEFINITION oauth_config
  TYPE = SECRET_AUTHORIZATION
  SECRET = app_schema.oauth_secret
  LABEL = 'Authenticate with external provider'
  DESCRIPTION = 'Complete the OAuth flow to connect the app to the external provider'
  APPLICATION_ROLES = (app_user);

SECRET パラメーターは、コンシューマーが OAuth フローを完了したときにトークンが入力されるシークレットを指定します。シークレットは <schema_name>.<secret_name>``(アプリ自体のデータベースが暗示されます)または完全修飾 ``<database_name>.<schema_name>.<secret_name> として指定できます。いずれの形式でも、シークレットはアプリケーションに所有されている必要があり、 APPLICATION_ROLES で指定されたアプリケーションロールは、シークレットに対する MODIFY 権限を所有している必要があります。

ステップ6:アプリコードで OAuth トークンを使用する

コンシューマーが OAuth フローを完了した後、シークレットには、アプリが外部アクセス呼び出しで使用できるアクセストークンが入力されます。オブジェクトの SECRETS プロパティを介して、シークレットを UDF、ストアドプロシージャ、または Snowpark Container Services コンテナに渡します。

コンシューマー認証

プロバイダーがアプリをセットアップした後、コンシューマーは Snowsight、 Python Permission SDK または SQL を使用して OAuth 認証を完了します。

重要

OAuth フローを完了する前に、コンシューマーはまず対応するセキュリティ統合アプリ仕様を承認する必要があります。詳細については、 Approve app specifications をご参照ください。

  1. OAuth 構成へのアクセス権限を持つアプリケーションロールが付与されたロールを使用して、 Snowsight にサインインします。OAuth フローを完了するには、構成に MODIFYVALUE 権限が必要です。これはプロバイダーが構成を作成する際に APPLICATION_ROLES パラメーターにリストされたアプリケーションロールに付与されます。

    セキュリティ統合アプリの仕様がまだ承認されていない場合、ロールはアカウント上でそれを承認するための MANAGEAPPLICATIONSPECIFICATIONS 権限も必要です。詳細については、 Approve app specifications をご参照ください。

  2. アプリのページに移動します。

  3. アプリケーションページで、 Configurations タブを選択します。

  4. External connections で、 Review をクリックしてセキュリティ統合を承認します。

    注釈

    認証の前に、対応するセキュリティ統合アプリ仕様を承認する必要があります。承認されない場合、フローは以下のエラーで失敗します。 Applications can not use security integration without a corresponding approved application specification.

  5. Authentication で、 Review をクリックし、次に OAuth 構成の Authenticate をクリックします。

  6. ブラウザーポップアップで OAuth 同意フローを完了します。

  7. 認証に成功すると、構成ステータスが自動的に更新されます。

トークンの有効期限と再認証

Snowflakeは、シークレットに保存されている更新トークンを使用して、現在のアクセストークンの有効期限が切れたときに新しいアクセストークンを取得します。更新トークン自体の有効期限が切れているか、サードパーティのプロバイダーによって取り消された場合、アプリからの外部アクセスの呼び出しに失敗し、コンシューマーは再認証する必要があります。

プロバイダーは、 Snowsight および Python Permission SDK または SQL でコンシューマーに再認証を促すことができます。

コンシューマーをアプリページの Configurations タブに誘導します。Authentication で、 OAuth 構成の Reauthenticate をクリックしてトークンを更新します。