接続の認証

Snowflakeに対する認証には、次のいずれかのオプションを使用できます。

さらに、Snowflake Node.js ドライバーは、 SSO および MFA トークンをキャッシュする機能をサポートしています。詳細については、 トークンキャッシング認証 をご参照ください。

ウェブブラウザーを介したシングルサインオン(SSO)を使用する

シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、認証にブラウザーベースの SSO を使用するようにクライアントアプリケーションを構成できます。

アプリケーションコード内で、

  1. authenticator オプションを EXTERNALBROWSER に設定します。

  2. 接続を確立するには、 connect メソッドではなく connectAsync メソッドを呼び出します。

例:

// Use a browser to authenticate via SSO.
var connection = snowflake.createConnection({
  ...,
  authenticator: "EXTERNALBROWSER"
});
// Establish a connection. Use connectAsync, rather than connect.
connection.connectAsync(
  function (err, conn)
  {
    ... // Handle any errors.
  }
).then(() =>
{
  // Execute SQL statements.
  var statement = connection.execute({...});
});
Copy

認証にブラウザーベースの SSO を使用する方法の詳細については、 ブラウザーベース SSO をご参照ください。

Oktaを介したネイティブ SSO を使用する

Oktaを介して シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、Oktaを介してネイティブ SSO 認証を使用するようにクライアントアプリケーションを構成できます。

アプリケーションコード内で、

  1. 次のオプションを設定します。

    • authenticator オプションをOktaアカウントのOkta URL エンドポイントに設定します(例: https://<Oktaアカウント名>.okta.com)。

    • username および password オプションをIDプロバイダー(IdP)のユーザー名とパスワードに設定します。

  2. 接続を確立するには、 connect メソッドではなく connectAsync メソッドを呼び出します。

例:

// Use native SSO authentication through Okta.
var connection = snowflake.createConnection({
  ...,
  username: '<user_name_for_okta>',
  password: '<password_for_okta>',
  authenticator: "https://myaccount.okta.com"
});

// Establish a connection.
connection.connectAsync(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

Oktaを介したネイティブ SSO 認証の使用の詳細については、 ネイティブ SSO --- Oktaのみ をご参照ください。

キーペア認証とキーペアローテーションを使用する

ドライバーは、キーペア認証とキーローテーションをサポートします。キーペア認証とキーローテーションを使用するには、次の手順に従います。

  1. キーペア認証とキーペアローテーション で説明されているように、キーペア認証を構成します。

  2. アプリケーションコード内で、

    1. authenticator オプションを SNOWFLAKE_JWT に設定します。

    2. 秘密キーを使用して、次のいずれかの方法で認証します。

      • privateKey オプションを秘密キーに設定します。

      • privateKeyPath オプションを秘密キーファイルへのパスに設定します。

        ファイルが暗号化されている場合は、 privateKeyPass オプションをパスフレーズに設定して秘密キーを復号化する必要もあります。

次の例では、ファイルから秘密キーをロードし、 privateKey オプションを秘密キーに設定します。

// Read the private key file from the filesystem.
var crypto = require('crypto');
var fs = require('fs');
var privateKeyFile = fs.readFileSync('<path_to_private_key_file>/rsa_key.p8');

// Get the private key from the file as an object.
const privateKeyObject = crypto.createPrivateKey({
  key: privateKeyFile,
  format: 'pem',
  passphrase: 'passphrase'
});

// Extract the private key from the object as a PEM-encoded string.
var privateKey = privateKeyObject.export({
  format: 'pem',
  type: 'pkcs8'
});

// Use the private key for authentication.
var connection = snowflake.createConnection({
  ...
  authenticator: "SNOWFLAKE_JWT",
  privateKey: privateKey
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

次の例では、 privateKeyPath オプションを暗号化された秘密キーファイルに設定し、 privateKeyPass オプションを秘密キーの復号化に使用されるパスフレーズに設定します。

// Use an encrypted private key file for authentication.
// Specify the passphrase for decrypting the key.
var connection = snowflake.createConnection({
  ...
  authenticator: "SNOWFLAKE_JWT",
  privateKeyPath: "<path-to-privatekey>/privatekey.p8",
  privateKeyPass: '<passphrase_to_decrypt_the_private_key>'
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

OAuth を使用する

OAuth を使用して接続するには、 authenticator オプションを OAUTH に設定し、 token オプションを OAuth アクセストークンに設定します。例:

// Use OAuth for authentication.
var connection = snowflake.createConnection({
  ...
  authenticator: "OAUTH",
  token: "<your_oauth_token>"
});

// Establish a connection.
connection.connect(
  function (err, conn)
  {
    ... // Handle any errors.
  }
);

// Execute SQL statements.
var statement = connection.execute({...});
Copy

詳細については、 クライアント、ドライバー、およびコネクタ をご参照ください。

MFA パスコードを使用する

注釈

この機能を使用するには、Snowflake Node.jsドライバーのバージョン1.13.1以降が必要です。

Duoからのプッシュ通知など外部からの確認を待つ代わりに、多要素認証(MFA)のパスコードを渡すことでSnowflakeに接続できます。ドライバーには、 MFA パスコードを指定する以下の方法があります。

  • passcodeInPassword オプションを:codenowrap:true に設定し、以下のようにパスワード文字列の一部としてパスコードを含めます。

    const connection = snowflake.createConnection({
        account: process.env.SNOWFLAKE_TEST_ACCOUNT,
        username: process.env.SNOWFLAKE_TEST_USER,
        ...
        authenticator: 'USERNAME_PASSWORD_MFA',
        password: "abc123987654", // passcode 987654 is part of the password
        passcodeInPassword: true  // because passcodeInPassword is true
    });
    
    Copy
  • passcode オプションをパスコードの値に設定し、以下のようにパスワードとパスコードを別々に指定します。

    const connection = snowflake.createConnection({
        account: process.env.SNOWFLAKE_TEST_ACCOUNT,
        username: process.env.SNOWFLAKE_TEST_USER,
        ...
        authenticator: 'USERNAME_PASSWORD_MFA',
        password: "abc123", // password and MFA passcode are input separately
        passcode: "987654"
    });
    
    Copy

    この方法を使うには、passcodeInPassword オプションが:codenowrap:false (デフォルト値)になっていることを確認してください。

注釈

passcodeInPassword オプションを有効にし、passcode オプションを設定すると、passcodeInPassword オプションが優先されます。

これらのオプションの詳細については、 passcode をご参照ください。

トークンキャッシング認証

Snowflake Node.js ドライバーは、 SSO と MFA トークンをキャッシュする機能を提供します。

重要

トークン・キャッシュはデフォルトで無効になっています。トークンをローカルにキャッシュすると、セキュリティ・リスクが高まります。トークンは4時間失効しないため、ローカル・システムでトークンにアクセスした人は、トークンの有効期限が自然に切れるまで、トークンの所有者になりすますことができます。従って、トークンをキャッシュすることを選択する前に、以下を考慮します。

  • 潜在的なリスクを認識し、留意すること。

  • 社内のセキュリティおよびコンプライアンス担当者に相談し、組織のポリシーがトークン・キャッシュを許可しているかどうかを確認してください。

  • デフォルト設定では、キャッシュされたトークンを保存するファイルは、 $HOME ディレクトリ、またはあなたが設定したパスに書き込まれます。あなたは、指定されたディレクトリ内のデータのセキュリティに責任を負います。

  • ファイル所有者のみがアクセスできるように、ファイルに適切なパーミッションが設定されていることを確認する責任があります。

キャッシュ SSO (ID) トークン

外部ブラウザー認証 で Snowflake に接続すると、リクエストからSSO(ID)トークンが生成されます。クライアント・ドライバー側での SSO (ID) トークンのキャッシュは、サーバーがキャッシュを許可している場合にのみ機能します。 Snowflakeに接続するクライアントアプリケーションでの SSO の使用 で説明されているように、 SQL ステートメントを実行することで、 SSO トークンのキャッシュをサーバー側で有効にすることができます。

ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Copy

Node.js ドライバーで SSO トークン・キャッシュを使用するには、snowflake.createConnection() 呼び出しで以下のオプションを設定します。

  • authenticator を:codenowrap:EXTERNALBROWSER に設定します。詳細については、 認証オプション をご参照ください。

  • clientStoreTemporaryCredential を:codenowrap:true に設定します。

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  username: process.env.SNOWFLAKE_TEST_USER,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'EXTERNALBROWSER',
  clientStoreTemporaryCredential: true,
});
Copy

有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが再度接続を認証するためにブラウザを開いた場合、ドライバーはローカル・認証情報・ストレージでトークン情報を見つけることができないか、トークンの有効期限が切れています。

MFA トークンをキャッシュする

USERNAME_PASSWORD_MFA 認証で Snowflake に接続すると、リクエストからMFA トークンが生成されます。クライアント・ドライバー側での MFA トークンのキャッシュは、サーバーがキャッシュを許可している場合にのみ機能します。 MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション で説明されているように、 SQL ステートメントを実行することで、 MFA トークンのキャッシュをサーバー側で有効にすることができます。

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Copy

Node.js ドライバーで MFA トークン・キャッシュを使用するには、snowflake.createConnection() 呼び出しで以下のオプションを設定します。

  • authenticator を:codenowrap:USERNAME_PASSWORD_MFA に設定します。詳細については、 認証オプション をご参照ください。

  • clientRequestMFAToken を:codenowrap:true に設定します。

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  username: process.env.SNOWFLAKE_TEST_USER,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true,
});
Copy

有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが MFA プロバイダーに再度アクセスすると、ドライバーがローカルの認証情報ストレージでトークン情報を見つけられないか、トークンの有効期限が切れています。

デフォルトの認証情報マネージャーを使用する

Snowflake Node.js ドライバーは、認証情報マネージャーと認証情報・ストレージを提供します。デフォルトでは、ドライバーはキャッシュされたトークンを $HOME ディレクトリに保存します。現在のところ、ドライバーはトークン・キャッシュを:codenowrap:connectAsync() 関数でのみサポートしています。

キャッシュされたトークンを別の場所に格納したい場合は、 snowflake.createConnection() 関数の credentialCacheDir パラメーターで希望の場所を指定できます。以下のように、相対パスまたは絶対パスを指定できます。

  • 相対サブパス

    const connection = snowflake.createConnection({
              credentialCacheDir: "../../<folder name>",
    });
    
    Copy
  • 絶対パス

    const connection = snowflake.createConnection({
              credentialCacheDir: "C:\\<folder name>\\<subfolder name>",
    });
    
    Copy

credentialCacheDir を設定しない場合、Snowflake Node.jsドライバーは $HOME/temporary_credential.json を使用して認証情報を保存します。

カスタムの認証情報マネージャーを使用する

Snowflake node.js ドライバーは、ローカルの JSON ファイルを使用して認証情報を格納する、デフォルトの認証情報マネージャーを提供します。認証情報・マネージャーが明示的に設定されていない場合、ドライバーはこのデフォルトの認証情報マネージャーを使用します。

デフォルトの認証情報マネージャーを使用したくない場合は、カスタムの認証情報・マネージャーを作成することができます。カスタム・認証情報マネージャーは、以下の要件を満たす必要があります。

  • readwrite と:codenowrap:remove 関数を最低限含んでいる必要があります。他の関数を含めることもできます。

  • object データ型である必要があります。

以下の例は、最小限のカスタム・認証情報マネージャーのテンプレートを示しています。

const sampleCustomManager = {
  read: function (key) {
  //(do something with the key)
    return token;
  },
  write: function (key, token) {
  //(do something with the key and token)
  },
  remove: function (key) {
    //(do something with the key)
  }
};
Copy

カスタム・認証情報マネージャーが完成したら、snowflake.configure() メソッドで、ドライバー用に設定することができます。この例は MFA トークンを反映したものですが、 SSO トークン用のカスタム・認証情報マネージャーを作成することもできます。

const myCredentialManager = require('<your custom credential manager module>')
const snowflake = require('snowflake-sdk');

snowflake.configure({
  customCredentialManager: myCredentialManager
})

const connection = snowflake.createConnection({
  account: process.env.SNOWFLAKE_TEST_ACCOUNT,
  database: process.env.SNOWFLAKE_TEST_DATABASE,
  schema: process.env.SNOWFLAKE_TEST_SCHEMA,
  warehouse: process.env.SNOWFLAKE_TEST_WAREHOUSE,
  authenticator: 'USERNAME_PASSWORD_MFA',
  clientRequestMFAToken: true,
});
Copy

Snowflake Node.js ドライバーは、カスタムの認証情報マネージャーを実装して使用するためのプラグインのようなインターフェイスを提供しますが、Snowflake はカスタマーのカスタムの認証情報マネージャーの作成、実装、サポートに責任を負いません。