对连接进行身份验证¶
要向 Snowflake 进行身份验证,您可以使用以下选项之一:
基于密码的身份验证
要使用此方法,请设置
password
建立连接时的选项。通过 Web 浏览器使用 :ref:` 单点登录 (SSO) <label-nodejs_sso>`
通过 Okta 使用 :ref:` 原生 SSO <label-nodejs_native_sso>`
此外,Snowflake Node.js 驱动程序支持缓存 SSO 和 MFA 令牌的功能。有关更多信息,请参阅 身份验证令牌缓存。
通过 Web 浏览器使用单点登录 (SSO)¶
如果您已 将 Snowflake 配置为使用单点登录 (SSO),则可以将客户端应用程序配置为使用基于浏览器的 SSO 进行身份验证。
在应用程序代码中,执行以下操作:
将
authenticator
选项设置为EXTERNALBROWSER
。要建立连接,请调用
connectAsync
方法,而不是connect
方法。
例如:
// 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¶
如果您已 :doc:` 将 Snowflake 配置为使用单点登录 (SSO) </user-guide/admin-security-fed-auth-overview>` (通过 Okta),则可以将客户端应用程序配置为通过 Okta 使用原生 SSO 身份验证。
在应用程序代码中,执行以下操作:
设置以下选项:
将
authenticator
选项设置为 Okta 账户的 Okta URL 端点(例如https://<okta_account_name>.okta.com
)。将
username
和password
选项设置为身份提供程序 (IdP) 的用户名和密码。
要建立连接,请调用
connectAsync
方法,而不是connect
方法。
例如:
// 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 或更高版本。
您可以通过多重身份验证 (MFA) 密码连接到 Snowflake,而不必等待外部确认,例如来自 Duo 的推送通知。驱动程序提供以下方法来指定 MFA 密码:
将
passcodeInPassword
选项设置为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 令牌的功能。
重要
默认情况下,令牌缓存功能处于禁用状态。在本地缓存令牌会增加安全风险。由于令牌在四小时内不会过期,因此在本地系统上访问令牌的人员可以冒充令牌所有者,直到令牌自然过期。因此,在选择缓存令牌之前,请考虑以下事项:
注意并留意潜在的风险。
请咨询您的内部安全和合规人员,检查您的组织的策略是否允许令牌缓存。
使用默认设置,存储缓存令牌的文件将写入您的
$HOME
目录,或者您指定的路径。您应对指定目录中数据的安全负责。您有责任确保该文件具有适当的权限,只有文件所有者才能访问。
缓存 SSO (ID) 令牌¶
SSO (ID) 令牌是在您使用以下方式连接到 Snowflake 时通过请求生成的 外部浏览器身份验证。在客户端驱动程序端缓存 SSO (ID) 令牌仅在服务器允许缓存令牌的情况下有效。可以通过在服务器端执行以下 SQL 语句来启用缓存 SSO 令牌的功能,如 为连接到 Snowflake 的客户端应用程序使用 SSO 中所述:
ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
要使用 SSO Node.js 驱动程序中的令牌缓存功能,请在 snowflake.createConnection()
调用中设置以下选项:
将
authenticator
设置为EXTERNALBROWSER
。有关详细信息,请参阅 身份验证选项。将
clientStoreTemporaryCredential
设置为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 令牌¶
MFA 令牌是当您使用 USERNAME_PASSWORD_MFA 身份验证连接到 Snowflake 时通过请求生成的。在客户端驱动程序端缓存 MFA 令牌仅在服务器允许缓存令牌的情况下有效。可以通过在服务器端执行以下 使用 MFA 令牌缓存,最大限度地减少身份验证过程中的提示次数 – 可选 语句来启用缓存 SQL 令牌的功能,如 中所述:
ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
要使用 MFA Node.js 驱动程序中的令牌缓存功能,请在 snowflake.createConnection()
调用中设置以下选项:
将
authenticator
设置为USERNAME_PASSWORD_MFA
。有关详细信息,请参阅 身份验证选项。将
clientRequestMFAToken
设置为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
目录中。目前,驱动程序仅支持使用 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
和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 不负责为客户创建、实现或支持自定义凭证管理器。