Exemple - Accès externe à l’aide de OAuth

Cette rubrique fournit un exemple qui décrit comment utiliser les références pour permettre aux fournisseurs d’accorder l’accès à un point de terminaison externe à Snowflake. Cet exemple utilise un secret OAuth2 et une intégration d’accès externe pour autoriser l’accès.

Ajouter des références au fichier manifeste

Pour permettre l’accès à un point de terminaison externe à l’aide de OAuth, un fournisseur peut ajouter les entrées suivantes dans le fichier manifest.yml :

  • Référence EXTERNAL ACCESS INTEGRATION avec le privilège USAGE

  • Référence SECRET avec le privilège READ

L’exemple de fichier manifest.yml suivant montre comment définir ces références :

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

Note

Ces références ne peuvent pas avoir la propriété multi_valued réglée sur true.

Les références aux secrets et aux objets d’accès externe nécessitent également une fonction configuration_callback dans le script de configuration. Pour plus d’informations, voir Ajouter la fonction configuration_callback au script d’installation.

Ajouter la fonction configuration_callback au script d’installation

Après avoir ajouté les références pour l’intégration du secret et de l’accès externe, vous devez ajouter la fonction configuration_callback au script d’installation. Pour créer une intégration ou un secret d’accès externe, l’application doit pouvoir déterminer les valeurs du port hôte, du type de secret, du point de terminaison de l’autorisation et du jeton pour OAuth, etc. configuration_callback fournit ces informations du compte du consommateur à l’application.

Snowsight exécute cette procédure de rappel pour remplir la boîte de dialogue de configuration qui invite l’utilisateur à configurer les objets. La procédure doit être attribuée à un rôle d’application pour être exécutée.

Note

configuration_callback n’est pris en charge que pour l’intégration de l’accès externe et les objets secrets.

La fonction de rappel doit remplir les conditions suivantes :

  • La fonction de rappel doit accepter un argument contenant un nom de référence. Cela permet à la même fonction de rappel de gérer plusieurs références.

  • La fonction de rappel doit renvoyer un objet JSON bien formé. L’objet JSON contient les propriétés suivantes :

    • type

      Indique le type de message. Les valeurs valides sont :

      • CONFIGURATION : renvoie une charge utile contenant les valeurs de configuration de l’objet en fonction du type d’objet.

      • ERROR : renvoie une erreur avec le message associé qui est affiché dans Snowsight.

    • payload

      Contient le contenu de la réponse en fonction de la valeur de la propriété type et du type d’objet configuré.

La signature du rappel de configuration est la suivante :

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

Dans le script d’installation, vous devez accorder le privilège USAGE aux rôles d’application utilisés pour configurer l’appli afin qu’ils aient la permission d’appeler la procédure stockée. L’exemple suivant montre comment accorder le privilège USAGE à une procédure stockée :

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

La fonction de rappel renvoie un objet JSON. Pour plus d’informations, voir Format JSON de la réponse du rappel de configuration.

L’exemple suivant montre une fonction de rappel typique pour gérer l’accès externe et les références de secrets.

Cette fonction permet d’effectuer les opérations suivantes :

  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

Utilisation du SDK d’autorisation d’accès Python pour les secrets et les intégrations d’accès externes

Python Permission SDK prend en charge les objets d’intégration d’accès secret et externe. Cependant, le comportement est légèrement différent pour ces objets.

Lorsqu’un fournisseur appelle permission.request_reference() et transmet le nom d’une référence dont la valeur est object_type de SECRET ou de EXTERNAL ACCESS INTEGRATION, Snowsight effectue automatiquement les opérations suivantes :

  • Appelle la fonction configuration_callback dans le script d’installation.

  • Valide les valeurs renvoyées par la fonction configuration_callback.

  • Affiche la boîte de dialogue de configuration pour le consommateur.

Note

Si un fournisseur configure une intégration d’accès externe avec la propriété payload.allow_secrets définie sur LIST, il n’est pas nécessaire d’effectuer un appel séparé pour demander une référence pour le secret. La configuration du secret est implicitement incluse dans la configuration de l’intégration de l’accès externe.