Authentification des connexions¶
Pour vous authentifier auprès de Snowflake, vous pouvez utiliser l’une des options suivantes :
Authentification par mot de passe
Pour utiliser cette méthode, définissez l’option
password
lors de l’établissement de la connexion.Connexion unique (SSO) via un navigateur Web
SSO Natif via Okta
De plus, le pilote Snowflake Node.js prend en charge la possibilité de mettre en cache les jetons SSO et MFA. Pour plus d’informations, voir Mise en cache du jeton d’authentification.
Connexion unique (SSO) via un navigateur Web¶
Si vous avez configuré Snowflake pour utiliser la connexion unique (SSO), vous pouvez configurer votre application cliente pour utiliser SSO sur navigateur pour l’authentification.
Dans le code de votre application :
Définissez l’option
authenticator
surEXTERNALBROWSER
.Pour établir une connexion, appelez la méthode
connectAsync
plutôt que la méthodeconnect
.
Par exemple :
// 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({...});
});
Pour plus d’informations sur l’utilisation de SSO sur navigateur pour l’authentification, voir SSO basé sur le navigateur.
Utiliser le SSO natif via Okta¶
Si vous avez configuré Snowflake pour utiliser la connexion unique (SSO) via Okta, vous pouvez configurer votre application cliente pour utiliser l’authentification SSO native via Okta.
Dans le code de votre application :
Définissez les options suivantes :
Définissez l’option
authenticator
sur le point de terminaison URL Okta de votre compte Okta (par exemple,https://<nom_compte_okta>.okta.com
).Définissez les options
username
etpassword
sur le nom d’utilisateur et le mot de passe de votre fournisseur d’identité (IdP).
Pour établir une connexion, appelez la méthode
connectAsync
plutôt que la méthodeconnect
.
Par exemple :
// 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({...});
Pour plus d’informations sur l’utilisation de l’authentification native SSO par Okta, voir Authentication SSO native — Okta uniquement.
Utiliser l’authentification par paire de clés et la rotation de paires de clés¶
Le pilote prend en charge l’authentification par paire de clés et la rotation des clés. Pour utiliser l’authentification par paire de clés et la rotation des clés, procédez comme suit :
Configurez l’authentification par paire de clés, comme expliqué dans Authentification par paire de clés et rotation de paires de clés.
Dans le code de votre application :
Définissez l’option
authenticator
surSNOWFLAKE_JWT
.Utilisez la clé privée pour vous authentifier de l’une des manières suivantes :
Définissez l’option
privateKey
sur la clé privée.Définissez l’option
privateKeyPath
comme le chemin d’accès au fichier de la clé privée.Si le fichier est chiffré, vous devez également définir l’option
privateKeyPass
sur la phrase secrète pour déchiffrer la clé privée.
L’exemple suivant charge la clé privée depuis un fichier et définit l’option
privateKey
sur la clé privée :// 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({...});L’exemple suivant définit l’option
privateKeyPath
sur un fichier de clé privée chiffré et définit l’optionprivateKeyPass
sur la phrase secrète utilisée pour déchiffrer la clé privée :// 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({...});
Utiliser OAuth¶
Pour se connecter en utilisant OAuth, définissez l’option authenticator
sur OAUTH
et l’option token
sur le jeton d’accès OAuth. Par exemple :
// 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({...});
Pour plus d’informations, voir Clients, pilotes et connecteurs.
Utiliser un code d’accès de MFA¶
Note
Cette fonctionnalité nécessite le pilote Snowflake Node.js version 1.13.1 ou supérieure.
Vous pouvez vous connecter à Snowflake en transmettant un code d’accès d’authentification multifactorielle (MFA) au lieu d’attendre une confirmation externe, comme une notification push de Duo. Le pilote fournit les moyens suivants pour spécifier un code d’accès de MFA :
Définissez l’option
passcodeInPassword
surtrue
et incluez le code d’accès dans la chaîne de mot de passe, comme suit :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 });
Définissez l’option
passcode
sur la valeur du code d’accès pour spécifier le mot de passe et le code d’accès séparément, de façon similaire à ce qui suit :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" });
Pour utiliser cette approche, assurez-vous que l’option codenowrap:
passcodeInPassword
estfalse
(la valeur par défaut).
Note
Si vous activez l’option passcodeInPassword
et définissez l’option passcode
, l’option passcodeInPassword
a la priorité.
Pour plus d’informations sur ces options, voir passcode.
Mise en cache du jeton d’authentification¶
Le pilote Snowflake Node.js offre la possibilité de mettre en cache les jetons SSO et MFA.
Important
La mise en cache des jetons est désactivée par défaut. La mise en cache locale des jetons augmente les risques de sécurité. Étant donné que les jetons n’expirent pas avant quatre heures, une personne qui accède à un jeton sur un système local peut se faire passer pour le propriétaire du jeton jusqu’à ce que le jeton expire naturellement. Par conséquent, avant de choisir de mettre en cache des jetons, tenez compte des éléments suivants :
Soyez conscient et attentif aux risques potentiels.
Consultez votre personnel de sécurité interne et de conformité pour vérifier si les politiques de votre organisation autorisent la mise en cache des jetons.
Avec les paramètres par défaut, le fichier qui stocke les jetons mis en cache est écrit dans votre répertoire
$HOME
, ou dans un chemin que vous définissez. Vous êtes responsable de la sécurité des données dans le répertoire désigné.Vous êtes responsable de vous assurer que le fichier dispose des autorisations appropriées pour être accessible uniquement par le propriétaire du fichier.
Mettre en cache les jetons SSO (ID)¶
Un jeton SSO (ID) est généré à partir de la demande lorsque vous vous connectez à Snowflake avec l’authentification du navigateur externe. La mise en cache des jetons SSO (ID) côté pilote client ne fonctionne que si le serveur l’autorise. La mise en cache des jetons SSO peut être activée côté serveur en exécutant l’instruction SQL suivante, telle que décrite dans Utilisation de SSO avec des applications clientes qui se connectent à Snowflake :
ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Pour utiliser un cache de jetons SSO dans le pilote Node.js, définissez les options suivantes dans l’appel snowflake.createConnection()
:
Définissez
authenticator
surEXTERNALBROWSER
. Pour plus de détails, voir Options d’authentification.Définissez
clientStoreTemporaryCredential
surtrue
.
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,
});
Lorsque cette option est activée, le pilote utilise le jeton mis en cache pour les connexions ultérieures jusqu’à l’expiration du jeton. Si le pilote ouvre un navigateur pour authentifier à nouveau la connexion, soit le pilote ne peut pas trouver les informations du jeton dans le stockage d’identifiants de connexion local, soit le jeton a expiré.
Mettre en cache les jetons MFA¶
Un jeton MFA est généré à partir de la demande lorsque vous vous connectez à Snowflake avec l’authentification USERNAME_PASSWORD_MFA. La mise en cache des jetons MFA côté pilote client ne fonctionne que si le serveur l’autorise. La mise en cache des jetons MFA peut être activée côté serveur en exécutant l’instruction SQL suivante, telle que décrite dans Utilisation de la mise en cache des jetons MFA pour réduire le nombre d’invites lors de l’authentification — Facultatif :
ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Pour utiliser un cache de jetons MFA dans le pilote Node.js, définissez les options suivantes dans l’appel snowflake.createConnection()
:
Définissez
authenticator
surUSERNAME_PASSWORD_MFA
. Pour plus de détails, voir Options d’authentification.Définissez
clientRequestMFAToken
surtrue
.
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,
});
Lorsque cette option est activée, le pilote utilise le jeton mis en cache pour les connexions ultérieures jusqu’à l’expiration du jeton. Si le pilote tend la main vers le fournisseur de MFA encore une fois, le fournisseur peut soit trouver les informations du jeton dans le stockage local des identifiants de connexion, soit le jeton a expiré.
Utiliser le gestionnaire d’identifiants de connexion par défaut¶
Le pilote Snowflake Node.js fournit un gestionnaire d’identifiants de connexion et un stockage d’identifiants de connexion. Par défaut, le pilote stocke les jetons mis en cache dans votre répertoire $HOME
. Actuellement, le pilote ne prend en charge que la mise en cache des jetons avec la fonction connectAsync()
.
Si vous souhaitez stocker les jetons mis en cache dans un autre emplacement, vous pouvez spécifier l’emplacement souhaité dans le paramètre credentialCacheDir
de la fonction snowflake.createConnection()
. Vous pouvez spécifier un chemin relatif ou absolu, comme indiqué ci-dessous :
Chemin relatif
const connection = snowflake.createConnection({ credentialCacheDir: "../../<folder name>", });
Chemin absolu
const connection = snowflake.createConnection({ credentialCacheDir: "C:\\<folder name>\\<subfolder name>", });
Si vous ne configurez pas credentialCacheDir
, le pilote Snowflake Node.js utilise $HOME/temporary_credential.json
pour stocker les identifiants de connexion.
Utiliser un gestionnaire d’identifiants de connexion personnalisé¶
Le pilote Snowflake node.js fournit un gestionnaire d’identifiants de connexion par défaut, qui utilise un fichier JSON local pour stocker les identifiants de connexion. Lorsqu’aucun gestionnaire d’identifiants de connexion n’est explicitement configuré, le pilote utilisera ce gestionnaire d’identifiants de connexion par défaut.
Si vous préférez ne pas utiliser le gestionnaire d’identifiants de connexion par défaut, vous pouvez créer un gestionnaire d’identifiants de connexion personnalisé. Un gestionnaire d’identifiants de connexion personnalisé doit répondre aux exigences suivantes :
Il doit contenir au minimum les fonctions codenowrap:
read
,write
etremove
. Vous pouvez également inclure d’autres fonctions.Ce doit être un type de données
object
.
L’exemple suivant montre un modèle pour un gestionnaire d’identifiants de connexion personnalisé minimal.
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)
}
};
Après avoir terminé votre gestionnaire d’identifiants de connexion personnalisé, vous pouvez le configurer pour le pilote dans la méthode snowflake.configure()
comme indiqué. Cet exemple reflète les jetons MFA, bien que vous puissiez également créer des gestionnaires d’identifiants de connexion personnalisés pour des jetons 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,
});
Bien que le pilote Snowflake Node.js fournisse une interface de type plug-in pour implémenter et utiliser des gestionnaires d’identifiants de connexion personnalisés, Snowflake n’est pas responsable de la création, de l’implémentation ou de la prise en charge des gestionnaires d’identifiants de connexion personnalisés pour les clients.