Authentifizieren von Verbindungen

Für die Authentifizierung bei Snowflake können Sie eine der folgenden Optionen verwenden:

Außerdem unterstützt der Snowflake Node.js-Treiber die Möglichkeit, SSO- und MFA-Token zu cachen. Weitere Informationen dazu finden Sie unter Cache für Authentifizierung mit Token.

Verwenden Sie Single Sign-On (SSO) über einen Webbrowser

Wenn Sie Snowflake für die Verwendung von Single Sign-On (SSO) konfiguriert haben, können Sie Ihre Clientanwendung so konfigurieren, dass browserbasiertes SSO für die Authentifizierung verwendet wird.

In Ihrem Anwendungscode:

  1. Setzen Sie die Option authenticator auf EXTERNALBROWSER.

  2. Rufen Sie zum Herstellen einer Verbindung die Methode connectAsync und nicht die Methode connect auf.

Beispiel:

// 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

Weitere Informationen zur Verwendung von browserbasiertem SSO für die Authentifizierung finden Sie unter Browser-basiertes SSO.

Verwenden Sie native SSO über Okta.

Wenn Sie Snowflake für die Verwendung von Single Sign-On (SSO) konfiguriert haben, und zwar über Okta, können Sie Ihre Clientanwendung so konfigurieren, dass sie die native SSO-Authentifizierung über Okta verwendet.

In Ihrem Anwendungscode:

  1. Legen Sie die folgenden Optionen fest:

    • Setzen Sie die Option authenticator auf den Okta-URL-Endpunkt für Ihr Okta-Konto (z. B. https://<Name_des_Okta-Kontos>.okta.com).

    • Setzen Sie die Optionen username und password auf den Benutzernamen und das Kennwort für Ihren Identitätsanbieter (IdP).

  2. Rufen Sie zum Herstellen einer Verbindung die Methode connectAsync und nicht die Methode connect auf.

Beispiel:

// 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

Weitere Informationen zur Verwendung der nativen SSO-Authentifizierung über Okta finden Sie unter Natives SSO – Nur Okta.

Verwenden Sie Authentifizierung von Schlüsselpaaren und Schlüsselpaar-Rotation

Der Treiber unterstützt Schlüsselpaar-Authentifizierung und Schlüsselrotation. Führen Sie die folgenden Schritte aus, um die Schlüsselpaar-Authentifizierung und die Schlüsselrotation zu verwenden:

  1. Konfigurieren Sie die Schlüsselpaar-Authentifizierung, wie unter Schlüsselpaar-Authentifizierung und Schlüsselpaar-Rotation erläutert.

  2. In Ihrem Anwendungscode:

    1. Setzen Sie die Option authenticator auf SNOWFLAKE_JWT.

    2. Verwenden Sie den privaten Schlüssel zur Authentifizierung auf eine der folgenden Arten:

      • Setzen Sie die Option privateKey auf den privaten Schlüssel.

      • Setzen Sie die Option privateKeyPath auf den Pfad zur Datei des privaten Schlüssels.

        Wenn die Datei verschlüsselt ist, müssen Sie auch die Option privateKeyPass auf die Passphrase setzen, um den privaten Schlüssel zu entschlüsseln.

Im folgenden Beispiel wird der private Schlüssel aus einer Datei geladen und die Option privateKey auf den privaten Schlüssel gesetzt:

// 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

Im folgenden Beispiel wird die Option privateKeyPath auf eine verschlüsselte Datei mit privatem Schlüssel gesetzt und die Option privateKeyPass auf die Passphrase gesetzt, die zum Entschlüsseln des privaten Schlüssels verwendet wird:

// 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

Verwenden von OAuth

Um eine Verbindung mit OAuth herzustellen, setzen Sie die Option authenticator auf OAUTH und die Option token auf das OAuth-Zugriffstoken. Beispiel:

// 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

Weitere Informationen dazu finden Sie unter Clients, Treiber und Konnektoren.

Verwenden Sie eine MFA Kennung

Bemerkung

Dieses Feature erfordert Snowflake Node.js-Treiber Version 1.13.1 oder höher.

Sie können eine Verbindung zu Snowflake herstellen, indem Sie eine mehrstufige Authentifizierung (MFA) als Kennung angeben, anstatt auf eine externe Bestätigung zu warten, z. B. eine Push-Benachrichtigung von Duo. Der Treiber bietet die folgenden Möglichkeiten, eine Kennung für MFA anzugeben:

  • Setzen Sie die Option passcodeInPassword auf true und fügen Sie das Kennwort als Teil der Zeichenfolge ein, ähnlich wie im Folgenden:

    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
  • Setzen Sie die Option passcode auf den Wert des Kennworts, um das Kennwort und die Kennung getrennt anzugeben, ähnlich wie im Folgenden:

    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

    Um diesen Ansatz zu verwenden, stellen Sie sicher, dass die Option passcodeInPassword auf false (der Standardwert) eingestellt ist.

Bemerkung

Wenn Sie die Option passcodeInPassword aktivieren und die Option Kennung einstellen, hat die Option passcodeInPassword Vorrang.

Weitere Informationen zu diesen Optionen finden Sie unter passcode.

Cache für Authentifizierung mit Token

Der Snowflake Node.js-Treiber bietet die Möglichkeit, die Token SSO und MFA zu cachen.

Wichtig

Der Cache für Token ist standardmäßig deaktiviert. Das lokale Cachen von Token erhöht das Sicherheitsrisiko. Da Token erst nach vier Stunden ablaufen, kann sich jemand, der auf ein Token auf einem lokalen System zugreift, als der Eigentümer des Tokens ausgeben, bis der Token natürlich abläuft. Bevor Sie sich für das Cachen von Token entscheiden, sollten Sie daher Folgendes bedenken:

  • Seien Sie sich der potenziellen Risiken bewusst und achtsam.

  • Wenden Sie sich an Ihr internes Sicherheits- und Compliance-Personal, um zu prüfen, ob die Richtlinien Ihrer Organisation das Cachen von Token erlauben.

  • In der Standardeinstellung wird die Datei, in der die gecachten Token gespeichert werden, in Ihr $HOME-Verzeichnis oder in einen von Ihnen konfigurierten Pfad geschrieben. Sie sind für die Sicherheit der Daten in dem angegebenen Verzeichnis verantwortlich.

  • Sie sind dafür verantwortlich, dass die Datei über die richtigen Berechtigungen verfügt, damit nur der Eigentümer der Datei darauf zugreifen kann.

Cache-SSO (ID)-Token

Ein SSO (ID)-Token wird aus der Anfrage generiert, wenn Sie eine Verbindung zu Snowflake mit externer Authentifizierung im Browser herstellen. Das Zwischenspeichern von SSO (ID)-Token auf der Seite des Client-Treibers funktioniert nur, wenn der Server das Zwischenspeichern erlaubt. Das Caching von SSO-Token kann serverseitig durch Ausführung der folgenden SQL-Anweisung aktiviert werden, wie in Verwenden von SSO bei Clientanwendungen, die sich mit Snowflake verbinden beschrieben:

ALTER ACCOUNT SET ALLOW_ID_TOKEN = TRUE;
Copy

Um einen SSO-Token-Cache im Node.js-Treiber zu verwenden, stellen Sie die folgenden Optionen im snowflake.createConnection()-Aufruf ein:

  • Setzen Sie Authentifikator auf EXTERNALBROWSER. Weitere Details dazu finden Sie unter Authentifizierungsoptionen.

  • Setzen Sie clientStoreTemporaryCredential auf 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

Wenn diese Option aktiviert ist, verwendet der Treiber das gecachte Token für nachfolgende Verbindungen, bis das Token abläuft. Wenn der Treiber einen Browser öffnet, um die Verbindung erneut zu authentifizieren, kann der Treiber entweder die Anmeldeinformationen im lokalen Speicher nicht finden oder das Token ist abgelaufen.

Cache-MFA-Token

Ein MFA-Token wird aus der Anfrage generiert, wenn Sie eine Verbindung zu Snowflake mit USERNAME_PASSWORD_MFA-Authentifizierung herstellen. Das Zwischenspeichern von MFA-Token auf der Seite des Client-Treibers funktioniert nur, wenn der Server das Zwischenspeichern erlaubt. Das Caching von MFA-Token kann serverseitig durch Ausführung der folgenden SQL-Anweisung aktiviert werden, wie in Verwenden von MFA-Tokencaching zur Minimierung der Anzahl von Eingabeaufforderungen bei der Authentifizierung – Optional beschrieben:

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
Copy

Um einen MFA-Token-Cache im Node.js-Treiber zu verwenden, stellen Sie die folgenden Optionen im snowflake.createConnection()-Aufruf ein:

  • Setzen Sie Authentifikator auf USERNAME_PASSWORD_MFA. Weitere Details dazu finden Sie unter Authentifizierungsoptionen.

  • Setzen Sie clientRequestMFAToken auf 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

Wenn diese Option aktiviert ist, verwendet der Treiber das gecachte Token für nachfolgende Verbindungen, bis das Token abläuft. Wenn sich der Treiber erneut an den MFA-Anbieter wendet, kann er entweder die Token-Informationen nicht im lokalen Speicher für Anmeldeinformationen finden oder das Token ist abgelaufen.

Verwenden Sie den standardmäßigen Anmeldeinformationen-Manager

Der Snowflake Node.js-Treiber bietet einen Manager für Anmeldeinformationen und einen Speicher für Anmeldeinformationen. Standardmäßig speichert der Treiber gecachte Token in Ihrem $HOME-Verzeichnis. Derzeit unterstützt der Treiber das Cachen von Token nur mit der connectAsync()-Funktion.

Wenn Sie die gecachten Token an einem anderen Speicherort speichern möchten, können Sie den gewünschten Speicherort im credentialCacheDir-Parameter der snowflake.createConnection() Funktion angeben. Sie können entweder einen relativen oder einen absoluten Pfad angeben, wie unten gezeigt:

  • Relativer Pfad

    const connection = snowflake.createConnection({
              credentialCacheDir: "../../<folder name>",
    });
    
    Copy
  • Absoluter Pfad

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

Wenn Sie credentialCacheDir nicht konfigurieren, verwendet der Snowflake Node.js-Treiber $HOME/temporary_credential.json, um die Anmeldeinformationen zu speichern.

Verwenden Sie einen benutzerdefinierten Manager für Anmeldeinformationen

Der Snowflake node.js-Treiber bietet einen standardmäßigen Anmeldeinformationen-Manager, der eine lokale JSON-Datei zum Speichern der Anmeldeinformationen verwendet. Wenn explizit kein Anmeldeinformationen-Manager konfiguriert ist, verwendet der Treiber diesen standardmäßigen Anmeldeinformationen-Manager.

Wenn Sie nicht den Standard-Manager für Anmeldeinformationen verwenden möchten, können Sie einen eigenen Manager für Anmeldeinformationen erstellen. Ein benutzerdefinierter Manager für Anmeldeinformationen muss die folgenden Anforderungen erfüllen:

  • Er muss mindestens die Funktionen read, write, und remove enthalten. Sie können auch andere Funktionen hinzufügen.

  • Es muss ein object-Datentyp sein.

Das folgende Beispiel zeigt eine Vorlage für einen minimalen benutzerdefinierten Manager für Anmeldeinformationen.

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

Nachdem Sie Ihren benutzerdefinierten Anmeldeinformationen-Manager fertiggestellt haben, können Sie ihn für den Treiber in der Methode snowflake.configure() konfigurieren, wie gezeigt. Dieses Beispiel bezieht sich auf die MFA-Token. Sie können jedoch auch benutzerdefinierte Anmeldeinformationen für die SSO-Token erstellen.

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

Obwohl der Snowflake Node.js-Treiber eine Plugin-ähnliche Weboberfläche für die Implementierung und Verwendung benutzerdefinierter Anmeldeinformationen bereitstellt, ist Snowflake nicht für die Erstellung, Implementierung oder Unterstützung benutzerdefinierter Anmeldeinformationen für die Kunden verantwortlich.