Authentification des connexions

Pour vous authentifier auprès de Snowflake, vous pouvez utiliser l’une des options suivantes :

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 :

  1. Définissez l’option authenticator sur EXTERNALBROWSER.

  2. Pour établir une connexion, appelez la méthode connectAsync plutôt que la méthode connect.

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({...});
});
Copy

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 :

  1. 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 et password sur le nom d’utilisateur et le mot de passe de votre fournisseur d’identité (IdP).

  2. Pour établir une connexion, appelez la méthode connectAsync plutôt que la méthode connect.

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({...});
Copy

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 :

  1. Configurez l’authentification par paire de clés, comme expliqué dans Authentification par paire de clés et rotation de paires de clés.

  2. Dans le code de votre application :

    1. Définissez l’option authenticator sur SNOWFLAKE_JWT.

    2. 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({...});
Copy

L’exemple suivant définit l’option privateKeyPath sur un fichier de clé privée chiffré et définit l’option privateKeyPass 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({...});
Copy

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({...});
Copy

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 sur true 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
    });
    
    Copy
  • 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"
    });
    
    Copy

    Pour utiliser cette approche, assurez-vous que l’option codenowrap:passcodeInPassword est false (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;
Copy

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 sur EXTERNALBROWSER. Pour plus de détails, voir Options d’authentification.

  • Définissez clientStoreTemporaryCredential sur 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

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;
Copy

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 sur USERNAME_PASSWORD_MFA. Pour plus de détails, voir Options d’authentification.

  • Définissez clientRequestMFAToken sur 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

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>",
    });
    
    Copy
  • Chemin absolu

    const connection = snowflake.createConnection({
              credentialCacheDir: "C:\\<folder name>\\<subfolder name>",
    });
    
    Copy

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 et remove. 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)
  }
};
Copy

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

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.