Beispiel – Externer Zugriff mit OAuth

Unter diesem Thema wird anhand eines Beispiels beschrieben, wie Anbieter mithilfe von Referenzen Zugriff auf einen Endpunkt gewähren können, der nicht zu Snowflake gehört. Dieses Beispiel verwendet ein OAuth2-Geheimnis und eine Integration für den externen Zugriff, um den Zugriff zu ermöglichen.

Referenzen zur Manifest-Datei hinzufügen

Um den Zugriff auf einen externen Endpunkt über OAuth zu ermöglichen, kann ein Anbieter die folgenden Einträge zur manifest.yml-Datei hinzufügen:

  • EXTERNAL ACCESS INTEGRATION-Referenz mit der Berechtigung USAGE

  • SECRET-Referenz mit der Berechtigung READ

Die folgende manifest.yml-Beispieldatei zeigt, wie Sie diese Referenzen definieren:

manifest_version: 1
configuration:
  log_level: warn
  trace_level: off
...
references:
  - consumer_secret:
      label: "Consumer's Secret"
      description: "Needed to authenticate with xyz.com"
      privileges:
        - READ
      object_type: SECRET
      register_callback: config.register_my_secret
      configuration_callback: config.get_config_for_ref
  - consumer_external_access:
      label: "Default External Access Integration"
      description: "This is required to access xyz.com"
      privileges:
        - USAGE
      object_type: EXTERNAL ACCESS INTEGRATION
      register_callback: config.register_reference
      configuration_callback: config.get_config_for_ref
      required_at_setup: true
Copy

Bemerkung

Bei diesen Referenzen darf die Eigenschaft multi_valued nicht auf „true“ gesetzt sein.

Referenzen auf Geheimnisse und externe Zugriffsobjekte erfordern ebenfalls eine configuration_callback-Funktion im Setup-Skript. Weitere Informationen dazu finden Sie unter Funktion „configuration_callback“ zu Setup-Skript hinzufügen.

Funktion „configuration_callback“ zu Setup-Skript hinzufügen

Nachdem Sie die Verweise für die Integration das Geheimnis und die Integration für den externen Zugriff hinzugefügt haben, müssen Sie die Funktion configuration_callback in das Setup-Skript einfügen. Um eine Integration für den externen Zugriff oder ein Geheimnis zu erstellen, muss die Anwendung in der Lage sein, Werte für den Port des Hosts, den Typ des Geheimnisses, die Autorisierung und den Token-Endpunkt für OAuth usw. zu bestimmen. Mit der Funktion configuration_callback werden diese Informationen der Anwendung vom Verbraucherkonto bereitgestellt.

Snowsight führt diese Callback-Prozedur aus, um den Konfigurationsdialog zu füllen, der den Benutzer auffordert, die Objekte zu konfigurieren. Damit die Prozedur ausgeführt wird, muss sie einer App-Rolle zugewiesen werden.

Bemerkung

Die Funktion „configuration_callback“ wird nur bei Integrationen für den externen Zugriff und Geheimnisobjekten unterstützt.

Die Callback-Funktion hat die folgenden Voraussetzungen:

  • Die Callback-Funktion muss ein Argument akzeptieren, das einen Referenznamen enthält. So kann dieselbe Callback-Funktion mehrere Referenzen verarbeiten.

  • Die Callback-Funktion muss ein wohlgeformtes JSON-Objekt zurückgeben. Das JSON-Objekt enthält die folgenden Eigenschaften:

    • type

      Gibt den Typ der Meldung an. Gültige Werte:

      • CONFIGURATION: Gibt einen Payload mit den Konfigurationswerten für das Objekt basierend auf dem Objekttyp zurück.

      • ERROR: Gibt einen Fehler mit der zugehörigen Meldung zurück, die in Snowsight angezeigt wird.

    • payload

      Enthält den Inhalt der Antwort basierend auf dem Wert der Eigenschaft type und dem konfigurierten Objekttyp.

Die Signatur für den Konfigurations-Callback ist wie folgt:

CREATE OR REPLACE PROCEDURE configuration_callback_name(ref_name string)
RETURNS STRING
language <language>
as
$$
  ...
$$
Copy

Innerhalb des Setup-Skripts müssen Sie den Anwendungsrollen, die für die Konfiguration der App verwendet werden, die Berechtigung USAGE zuweisen, damit sie die gespeicherte Prozedur aufrufen dürfen. Das folgende Beispiel zeigt, wie Sie die Berechtigung USAGE einer gespeicherten Prozedur zuweisen:

GRANT USAGE ON PROCEDURE configuration_callback_name(string)
  TO APPLICATION ROLE app_role;
Copy

Die Callback-Funktion gibt ein JSON-Objekt zurück. Weitere Informationen dazu finden Sie unter JSON-Format für die Konfigurations-Callback-Antwort.

Das folgende Beispiel zeigt eine typische Callback-Funktion für den Umgang mit Referenzen auf externe Zugriffe und Geheimnisse.

Diese Funktion macht Folgendes:

  • Für eine Referenz auf eine Integration für den externen Zugriff gibt die Prozedur ein JSON-Objekt zurück, das die erforderlichen Konfigurationsinformationen enthält. Weitere Informationen dazu finden Sie unter JSON-Format für Integration für den externen Zugriff.

  • Für eine Referenz auf ein Geheimnis gibt die Prozedur ein JSON-Objekt zurück, das eine Geheimniskonfiguration vom Typ OAuth2 enthält. Weitere Informationen dazu finden Sie unter JSON-Format bei Geheimnisreferenzen.

  CREATE OR REPLACE PROCEDURE config.get_config_for_ref(ref_name STRING)
    RETURNS STRING
    LANGUAGE SQL
    AS
    $$
    BEGIN
      CASE (ref_name)
        WHEN 'CONSUMER_EXTERNAL_ACCESS' THEN
          RETURN '{
            "type": "CONFIGURATION",
            "payload":{
              "host_ports":["google.com"],
              "allowed_secrets" : "LIST",
              "secret_references":["CONSUMER_SECRET"]}}';
        WHEN 'CONSUMER_SECRET' THEN
          RETURN '{
            "type": "CONFIGURATION",
            "payload":{
              "type" : "OAUTH2",
              "security_integration": {
                "oauth_scopes": ["https://www.googleapis.com/auth/analytics.readonly"],
                "oauth_token_endpoint": "https://oauth2.googleapis.com/token",
                "oauth_authorization_endpoint":
                    "https://accounts.google.com/o/oauth2/auth"}}}';
  END CASE;
  RETURN '';
  END;
  $$;

GRANT USAGE ON PROCEDURE config.get_config_for_ref(string)
  TO APPLICATION ROLE app_admin;
Copy

Verwenden der Python Permission SDK für Geheimnisse und Integrationen für den externen Zugriff

Das Python Permission SDK unterstützt Geheimnisse und Integrationen für den externen Zugriff. Allerdings ist das Verhalten bei diesen Objekten etwas anders.

Wenn ein Anbieter permission.request_reference() aufruft und den Namen einer Referenz mit einem object_type-Wert von SECRET oder EXTERNAL ACCESS INTEGRATION übergibt, führt Snowsight automatisch Folgendes aus:

  • Ruft die Funktion configuration_callback im Setup-Skript auf.

  • Validiert die von der Funktion configuration_callback zurückgegebenen Werte.

  • Zeigt den Konfigurationsdialog für den Verbraucher an.

Bemerkung

Wenn ein Anbieter eine Integration für den externen Zugriff mit der Eigenschaft payload.allow_secrets konfiguriert, die auf LIST eingestellt ist, ist es nicht erforderlich, einen separaten Aufruf zu tätigen, um eine Referenz für das Geheimnis anzufordern. Die Geheimniskonfiguration ist implizit Teil der Konfiguration für die Integration des externen Zugriffs.