接続の認証¶
Snowflakeに対する認証には、次のいずれかのオプションを使用できます。
パスワードベースの認証
このメソッドを使用するには、接続を確立するときに
password
オプションを設定します。ウェブブラウザーを介した Single sign-on (SSO)
Oktaを介した Native SSO
さらに、Snowflake Node.js ドライバーは、 SSO および MFA トークンをキャッシュする機能をサポートしています。詳細については、 トークンキャッシング認証 をご参照ください。
ウェブブラウザーを介したシングルサインオン(SSO)を使用する¶
シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、認証にブラウザーベースの SSO を使用するようにクライアントアプリケーションを構成できます。
アプリケーションコード内で、
authenticator
オプションをEXTERNALBROWSER
に設定します。接続を確立するには、
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({...});
});
認証にブラウザーベースの SSO を使用する方法の詳細については、 ブラウザーベース SSO をご参照ください。
Oktaを介したネイティブ SSO を使用する¶
Oktaを介して シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合は、Oktaを介してネイティブ SSO 認証を使用するようにクライアントアプリケーションを構成できます。
アプリケーションコード内で、
次のオプションを設定します。
authenticator
オプションをOktaアカウントのOkta URL エンドポイントに設定します(例:https://<Oktaアカウント名>.okta.com
)。username
およびpassword
オプションをIDプロバイダー(IdP)のユーザー名とパスワードに設定します。
接続を確立するには、
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({...});
Oktaを介したネイティブ SSO 認証の使用の詳細については、 ネイティブ SSO --- Oktaのみ をご参照ください。
キーペア認証とキーペアローテーションを使用する¶
ドライバーは、キーペア認証とキーローテーションをサポートします。キーペア認証とキーローテーションを使用するには、次の手順に従います。
キーペア認証とキーペアローテーション で説明されているように、キーペア認証を構成します。
アプリケーションコード内で、
authenticator
オプションをSNOWFLAKE_JWT
に設定します。秘密キーを使用して、次のいずれかの方法で認証します。
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({...});次の例では、
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({...});
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({...});
詳細については、 クライアント、ドライバー、およびコネクタ をご参照ください。
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 });
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" });
この方法を使うには、
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;
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,
});
有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが再度接続を認証するためにブラウザを開いた場合、ドライバーはローカル・認証情報・ストレージでトークン情報を見つけることができないか、トークンの有効期限が切れています。
MFA トークンをキャッシュする¶
USERNAME_PASSWORD_MFA 認証で Snowflake に接続すると、リクエストからMFA トークンが生成されます。クライアント・ドライバー側での MFA トークンのキャッシュは、サーバーがキャッシュを許可している場合にのみ機能します。 MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション で説明されているように、 SQL ステートメントを実行することで、 MFA トークンのキャッシュをサーバー側で有効にすることができます。
ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
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,
});
有効にすると、ドライバーはトークンの有効期限が切れるまで、キャッシュされたトークンをその後の接続に使用します。ドライバーが MFA プロバイダーに再度アクセスすると、ドライバーがローカルの認証情報ストレージでトークン情報を見つけられないか、トークンの有効期限が切れています。
デフォルトの認証情報マネージャーを使用する¶
Snowflake Node.js ドライバーは、認証情報マネージャーと認証情報・ストレージを提供します。デフォルトでは、ドライバーはキャッシュされたトークンを $HOME
ディレクトリに保存します。現在のところ、ドライバーはトークン・キャッシュを:codenowrap:connectAsync()
関数でのみサポートしています。
キャッシュされたトークンを別の場所に格納したい場合は、 snowflake.createConnection()
関数の credentialCacheDir
パラメーターで希望の場所を指定できます。以下のように、相対パスまたは絶対パスを指定できます。
相対サブパス
const connection = snowflake.createConnection({ credentialCacheDir: "../../<folder name>", });
絶対パス
const connection = snowflake.createConnection({ credentialCacheDir: "C:\\<folder name>\\<subfolder name>", });
credentialCacheDir
を設定しない場合、Snowflake Node.jsドライバーは $HOME/temporary_credential.json
を使用して認証情報を保存します。
カスタムの認証情報マネージャーを使用する¶
Snowflake node.js ドライバーは、ローカルの JSON ファイルを使用して認証情報を格納する、デフォルトの認証情報マネージャーを提供します。認証情報・マネージャーが明示的に設定されていない場合、ドライバーはこのデフォルトの認証情報マネージャーを使用します。
デフォルトの認証情報マネージャーを使用したくない場合は、カスタムの認証情報・マネージャーを作成することができます。カスタム・認証情報マネージャーは、以下の要件を満たす必要があります。
read
、write
と: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)
}
};
カスタム・認証情報マネージャーが完成したら、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,
});
Snowflake Node.js ドライバーは、カスタムの認証情報マネージャーを実装して使用するためのプラグインのようなインターフェイスを提供しますが、Snowflake はカスタマーのカスタムの認証情報マネージャーの作成、実装、サポートに責任を負いません。