Autenticação de conexões¶
Para autenticar no Snowflake, você pode usar uma das seguintes opções:
Autenticação baseada em senha
Para usar este método, defina a opção
password
ao estabelecer a conexão.Login único (SSO) em um navegador da Web
SSO Nativo através do Okta
Além disso, o driver Snowflake Node.js oferece suporte à capacidade de armazenar cache tokens de SSO e MFA. Para obter mais informações, consulte Cache do token de autenticação.
Use o login único (SSO) por meio de um navegador da Web¶
Se você tiver configurado o Snowflake para usar o login único (SSO), pode configurar seu aplicativo cliente para usar o SSO baseado em navegador para autenticação.
Em seu código do aplicativo:
Defina a opção
authenticator
comoEXTERNALBROWSER
.Para estabelecer uma conexão, chame o método
connectAsync
, ao invés do métodoconnect
.
Por exemplo:
// 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({...});
});
Para obter mais informações sobre o uso de SSO para autenticação com base no navegador, ver SSO baseado em navegador.
Use SSO nativo através do Okta¶
Se você tiver configurado o Snowflake para usar o login único (SSO) através do Okta, pode configurar seu aplicativo cliente para usar a autenticação com SSO nativo através do Okta.
Em seu código do aplicativo:
Defina as seguintes opções:
Defina a opção
authenticator
para o ponto de extremidade de URL do Okta para sua conta Okta (por exemplo,https://<nome_conta_okta>.okta.com
).Defina as opções
username
epassword
para o nome de usuário e senha de seu provedor de identidade (IdP).
Para estabelecer uma conexão, chame o método
connectAsync
, ao invés do métodoconnect
.
Por exemplo:
// 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({...});
Para obter mais informações sobre o uso da autenticação com SSO nativo através do Okta, consulte SSO nativo — Somente Okta.
Use autenticação de par de chaves e rotação de par de chaves¶
O driver suporta autenticação de par de chaves e rodízio de chaves. Para utilizar a autenticação de pares de chaves e o rodízio de chaves, siga os passos abaixo:
Configure a autenticação de par de chaves, como explicado em Autenticação de pares de chaves e rotação de pares de chaves.
Em seu código do aplicativo:
Defina a opção
authenticator
comoSNOWFLAKE_JWT
.Use a chave privada para autenticar de uma das seguintes maneiras:
Defina a opção
privateKey
com a chave privada.Defina a opção
privateKeyPath
com o caminho para o arquivo de chave privada.Se o arquivo for criptografado, você também deve definir a opção
privateKeyPass
com a senha para descriptografar a chave privada.
O exemplo a seguir carrega a chave privada de um arquivo e define a opção
privateKey
para a chave privada:// 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({...});O exemplo a seguir define a opção
privateKeyPath
para um arquivo de chave privada criptografada e define a opçãoprivateKeyPass
para a senha usada para descriptografar a chave privada:// 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({...});
Uso de OAuth¶
Para conectar usando OAuth, defina a opção authenticator
como OAUTH
e a opção token
com o token de acesso OAuth. Por exemplo:
// 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({...});
Para obter mais informações, consulte Clientes, drivers e conectores.
Use uma senha numérica MFA¶
Nota
Este recurso requer o driver Snowflake Node.js versão 1.13.1 ou superior.
É possível se conectar ao Snowflake passando uma senha numérica de autenticação multifator (MFA) em vez de esperar por uma confirmação externa, como uma notificação push do Duo. O driver fornece as seguintes maneiras de especificar uma senha numérica MFA:
Defina a opção
passcodeInPassword
comotrue
e inclua a senha numérica como parte da cadeia de caracteres de senha, semelhante ao seguinte: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 });
Defina a opção
passcode
como o valor da senha numérica para especificar a senha e a senha numérica separadamente, semelhante ao seguinte: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" });
Para usar essa abordagem, certifique-se de que a opção
passcodeInPassword
sejafalse
(o valor padrão).
Nota
Se você habilitar a opção passcodeInPassword
e definir a opção passcode
, a opção passcodeInPassword
terá precedência.
Para obter mais informações sobre essas opções, consulte passcode.
Cache do token de autenticação¶
O driver Snowflake Node.js fornece a capacidade de armazenar em cache tokens SSO e MFA.
Importante
O armazenamento em cache de tokens é desabilitado por padrão. Armazenar tokens em cache localmente aumenta os riscos de segurança. Como os tokens não expiram por quatro horas, alguém que acessa um token em um sistema local pode se passar pelo proprietário do token até que token expire naturalmente. Portanto, antes de escolher armazenar tokens em cache, considere o seguinte:
Esteja ciente e atento aos riscos potenciais.
Consulte sua equipe interna de segurança e conformidade para verificar se as políticas da organização permitem o armazenamento em cache de token.
Com as configurações padrão, o arquivo que armazena os tokens em cache é gravado no diretório
$HOME
ou em um caminho que você configurou. Você é responsável pela segurança dos dados no diretório designado.Você é responsável por garantir que o arquivo tenha permissões adequadas para ser acessado somente pelo proprietário do arquivo.
Cache de tokens SSO (ID)¶
Um token SSO (ID) é gerado a partir da solicitação quando você se conecta ao Snowflake com autenticação de navegador externo. O armazenamento em cache SSO (ID) de tokens no lado do driver do cliente só funciona se o servidor permitir que eles sejam armazenados em cache. O armazenamento em cache de tokens SSO pode ser habilitado no lado do servidor executando a seguinte instrução SQL, conforme descrito em Uso de SSO com aplicativos clientes que se conectam ao Snowflake:
ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Para usar um cache de token SSO no driver Node.js, defina as seguintes opções na chamada snowflake.createConnection()
:
Defina
authenticator
comoEXTERNALBROWSER
. Para obter mais detalhes, consulte Opções de autenticação.Defina
clientStoreTemporaryCredential
comotrue
.
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,
});
Quando ativado, o driver usa o token armazenado em cache para conexões subsequentes até que o token expire. Se o driver abrir um navegador para autenticar a conexão novamente, o driver não conseguirá encontrar as informações do token no armazenamento de credencial local ou o token expirou.
Cache de tokens MFA¶
Um token MFA é gerado a partir da solicitação quando você se conecta ao Snowflake com autenticação USERNAME_PASSWORD_MFA. O armazenamento em cache de tokens MFA no lado do driver do cliente só funciona se o servidor permitir que eles sejam armazenados em cache. O armazenamento em cache de tokens MFA pode ser habilitado no lado do servidor executando a seguinte instrução SQL, conforme descrito em Uso do armazenamento em cache de tokens MFA para minimizar o número de tentativas durante a autenticação — opcional:
ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Para usar um cache de token MFA no driver Node.js, defina as seguintes opções na chamada snowflake.createConnection()
:
Defina
authenticator
comoUSERNAME_PASSWORD_MFA
. Para obter mais detalhes, consulte Opções de autenticação.Defina
clientRequestMFAToken
comotrue
.
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,
});
Quando ativado, o driver usa o token armazenado em cache para conexões subsequentes até que o token expire. Se o driver entrar em contato com o provedor de MFA novamente, o driver não conseguirá encontrar as informações do token no armazenamento de credencial local ou o token expirou.
Use o gerenciador de credenciais padrão¶
O driver Snowflake Node.js fornece um gerenciador de credenciais e armazenamento de credenciais. Por padrão, o driver armazena tokens em cache no diretório $HOME
. Atualmente, o driver só oferece suporte ao cache de token com a função connectAsync()
.
Se você quiser armazenar os tokens em cache em um local alternativo, poderá especificar o local desejado no parâmetro credentialCacheDir
da função snowflake.createConnection()
. É possível especificar um caminho relativo ou absoluto, conforme mostrado abaixo:
Caminho relativo
const connection = snowflake.createConnection({ credentialCacheDir: "../../<folder name>", });
Caminho absoluto
const connection = snowflake.createConnection({ credentialCacheDir: "C:\\<folder name>\\<subfolder name>", });
Se você não configurar credentialCacheDir
, o driver Snowflake Node.js usará $HOME/temporary_credential.json
para armazenar as credenciais.
Use um gerenciador de credenciais personalizado¶
O driver Snowflake node.js fornece um gerenciador de credenciais padrão, que usa um arquivo JSON local para armazenar as credenciais. Quando nenhum gerenciador de credenciais estiver explicitamente configurado, o driver usará este gerenciador de credenciais padrão.
Se você preferir não usar o gerenciador de credenciais padrão, poderá criar um gerenciador de credenciais personalizado. Um gerenciador de credenciais personalizado deve atender aos seguintes requisitos:
Ele deve conter no mínimo as funções codenowrap:
read
,write
eremove
. Você também pode incluir outras funções.Deve ser um tipo de dados
object
.
O exemplo a seguir mostra um modelo para um gerenciador de credenciais personalizado mínimo.
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)
}
};
Após concluir seu gerenciador de credenciais personalizado, você pode configurá-lo para o driver no método snowflake.configure()
, conforme mostrado. Este exemplo reflete tokens MFA, embora também seja possível criar gerenciadores de credenciais personalizados para tokens 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,
});
Embora o driver Snowflake Node.js forneça uma interface semelhante a um plugin para implementar e usar gerenciadores de credenciais personalizados, a Snowflake não é responsável por criar, implementar ou oferecer suporte a gerenciadores de credenciais personalizados para os clientes.