对连接进行身份验证

要向 Snowflake 进行身份验证,您可以使用以下选项之一:

  • 基于密码的身份验证

    要使用此方法,请设置 password 建立连接时的选项。

  • 通过 Web 浏览器使用 :ref:` 单点登录 (SSO) <label-nodejs_sso>`

  • 通过 Okta 使用 :ref:` 原生 SSO <label-nodejs_native_sso>`

  • 密钥对身份验证

  • OAuth

  • MFA

此外,Snowflake Node.js 驱动程序支持缓存 SSO 和 MFA 令牌的功能。有关更多信息,请参阅 身份验证令牌缓存

通过 Web 浏览器使用单点登录 (SSO)

如果您已 将 Snowflake 配置为使用单点登录 (SSO),则可以将客户端应用程序配置为使用基于浏览器的 SSO 进行身份验证。

在应用程序代码中,执行以下操作:

  1. authenticator 选项设置为 EXTERNALBROWSER

  2. 要建立连接,请调用 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({...});
});
Copy

有关使用基于浏览器的 SSO 进行身份验证的更多信息,请参阅 基于浏览器的 SSO

通过 Okta 使用原生 SSO

如果您已 :doc:` 将 Snowflake 配置为使用单点登录 (SSO) </user-guide/admin-security-fed-auth-overview>` (通过 Okta),则可以将客户端应用程序配置为通过 Okta 使用原生 SSO 身份验证。

在应用程序代码中,执行以下操作:

  1. 设置以下选项:

    • authenticator 选项设置为 Okta 账户的 Okta URL 端点(例如 https://<okta_account_name>.okta.com)。

    • usernamepassword 选项设置为身份提供程序 (IdP) 的用户名和密码。

  2. 要建立连接,请调用 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({...});
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 或更高版本。

您可以通过多重身份验证 (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
    });
    
    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 令牌的功能。

重要

默认情况下,令牌缓存功能处于禁用状态。在本地缓存令牌会增加安全风险。由于令牌在四小时内不会过期,因此在本地系统上访问令牌的人员可以冒充令牌所有者,直到令牌自然过期。因此,在选择缓存令牌之前,请考虑以下事项:

  • 注意并留意潜在的风险。

  • 请咨询您的内部安全和合规人员,检查您的组织的策略是否允许令牌缓存。

  • 使用默认设置,存储缓存令牌的文件将写入您的 $HOME 目录,或者您指定的路径。您应对指定目录中数据的安全负责。

  • 您有责任确保该文件具有适当的权限,只有文件所有者才能访问。

缓存 SSO (ID) 令牌

SSO (ID) 令牌是在您使用以下方式连接到 Snowflake 时通过请求生成的 外部浏览器身份验证。在客户端驱动程序端缓存 SSO (ID) 令牌仅在服务器允许缓存令牌的情况下有效。可以通过在服务器端执行以下 SQL 语句来启用缓存 SSO 令牌的功能,如 为连接到 Snowflake 的客户端应用程序使用 SSO 中所述:

ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Copy

要使用 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,
});
Copy

启用后,驱动程序将使用缓存的令牌进行后续连接,直到令牌过期。如果驱动程序打开浏览器再次验证连接,则驱动程序无法在本地凭证存储中找到令牌信息,或者令牌已过期。

缓存 MFA 令牌

MFA 令牌是当您使用 USERNAME_PASSWORD_MFA 身份验证连接到 Snowflake 时通过请求生成的。在客户端驱动程序端缓存 MFA 令牌仅在服务器允许缓存令牌的情况下有效。可以通过在服务器端执行以下 使用 MFA 令牌缓存,最大限度地减少身份验证过程中的提示次数 – 可选 语句来启用缓存 SQL 令牌的功能,如 中所述:

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Copy

要使用 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,
});
Copy

启用后,驱动程序将使用缓存的令牌进行后续连接,直到令牌过期。如果驱动程序再次联系 MFA 提供商,则驱动程序无法在本地凭证存储中找到令牌信息,或者令牌已过期。

使用默认凭据管理器

Snowflake Node.js 驱动程序提供了凭据管理器和凭据存储。默认情况下,驱动程序将缓存的令牌存储在您的 $HOME 目录中。目前,驱动程序仅支持使用 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 文件以存储凭据。如果没有显式配置凭据管理器,驱动程序将使用此默认凭据管理器。

如果您不想使用默认凭据管理器,您可以创建自定义凭据管理器。自定义凭据管理器必须满足以下要求:

  • 它必须至少包含 readwriteremove 函数。您还可以包括其他函数。

  • 它必须是 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 不负责为客户创建、实现或支持自定义凭证管理器。

语言: 中文