对连接进行身份验证¶
要向 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({...});
有关更多信息,请参阅 客户端、驱动程序和连接器。
使用 OAuth 2.0 客户端凭据流程¶
OAuth 2.0 客户端凭据流程为机器对机器 (M2M) 身份验证提供了一种安全的方式,例如连接后端服务的 Snowflake Connector for Python。与 OAuth 2.0 授权码流程不同,此方法不依赖于任何用户特定的数据。
要启用 OAuth 2.0 客户端凭据流程,请执行以下操作:
将
authenticator
连接参数设置为oauth_client_credentials
。设置以下 OAuth 连接参数:
oauthClientId
:身份提供商为 Snowflake 集成提供的 :codenowrap:client id 的值(Snowflake 安全集成元数据)。oauthClientSecret
:身份提供商为 Snowflake 集成提供的client secret
的值(Snowflake 安全集成元数据)oauthTokenRequestUrl
:向驱动程序提供访问令牌的身份提供商端点。oauthScope
:身份提供商授权请求中请求的范围。默认情况下,它源自角色。当需要多个作用域时,该值应为以空格分隔的多个作用域列表。
使用工作负载身份联合 (WIF) 进行身份验证¶
工作负载身份联合 为 Snowflake 提供了一种服务到服务的身份验证方法。通过这种方法,应用程序、服务或容器能够利用其云提供商的原生身份系统(例如 AWS IAM、Microsoft Entra ID 或 Google Cloud 服务账户)向 Snowflake 进行身份验证。与外部 OAuth 等其他方法相比,这种方法无需管理长期凭据,并简化了凭据的获取过程。Snowflake 连接器旨在自动从平台的身份提供商处获取短期凭据。
要启用工作负载身份联合身份验证器,请执行以下操作:
Set the
authenticator
connection parameter toWORKLOAD_IDENTITY
.根据您的平台,将
workloadIdentityProvider
连接参数设置为AWS
、AZURE
、GCP
或OIDC
。对于 OpenID Connect (OIDC),指定
token
连接参数。
使用 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 不负责为客户创建、实现或支持自定义凭证管理器。