DASTRA
Français
Français
  • Introduction à Dastra
  • 🇪🇺Rappels utiles
    • Introduction au RGPD
    • Notions clefs du RGPD
      • Donnée personnelle
      • Registre des traitements
      • Analyse d'impact
      • Durées de conservation
      • Droits des personnes
      • Confidentialité dès la conception et par défaut
      • Mesures de sécurité
      • Violations de données
    • Gestion des risques
      • Définition des risques
      • Evaluation d'un risque
      • Risques sous-traitants
  • 👨‍💻Bien commencer
    • Mise en place
      • Les notions importantes
      • Créer et paramétrer un espace de travail
      • Créer et paramétrer les unités organisationnelles
      • Désigner un DPO
      • Ajouter une autorité chef de file
      • Inviter des utilisateurs
      • Gérer les rôles et permissions
      • Créer puis affecter des équipes
      • Questions fréquentes
    • Tutoriel
      • Etape 1 : La mise en place
      • Etape 2 : Cartographier vos traitements de données à caractère personnel et établir le registre
      • Etape 3 : Gérer les risques
      • Etape 4 : Prioriser les actions à mener
      • Etape 5 : Implémenter les processus internes
      • Etape 6 : Documenter la conformité
    • Support
      • L'assistant dastronaute
      • L'aide en ligne
      • Demande de support
      • Le processus de support client
  • ⚙️Les fonctionnalités
    • Tableau de bord
    • Généralités
      • Filtres avancés
      • Importer vos données (Excel, Csv)
      • Gestion des tags
      • Champs personnalisés
      • Assistant IA
      • Modèles email
      • 😇Foire aux questions
      • Discussions internes
    • Cartographie des données
      • Référentiels
    • Registre des traitements
      • Registre "Responsable de traitement"
      • Registre "Sous-traitant"
      • Etablissez votre registre
      • Exporter / importer le registre
      • Utiliser un modèle de traitement
      • Déclarer un traitement
      • Compléter un traitement
        • Général
        • Parties prenantes
        • Finalités
        • Actifs
        • Données et conservation
        • Personnes concernées
        • Droits des personnes
        • Destinataires
          • Transferts de données hors UE
        • Mesures de sécurité
        • Analyse d'impact
        • Documents
        • Récapitulatif
      • Créer des relations entre les traitements
      • Fraicheur des traitements
      • Partager le registre
      • Visualisation des données
        • Visualiser l'arborescence des traitements
        • Visualiser la cartographie des données du registre
        • Visualiser la carte des transferts
      • Questions fréquentes
    • Gestion de documents (GED)
      • Modèles de documents
    • Questionnaires et PIA
      • Créer ou modifier un modèle de questionnaire ou un PIA
        • Créer ou modifier un modèle de PIA
      • Planifier un questionnaire ou un PIA
      • Partager un rapport d'audit ou PIA
      • Supprimer un audit ou un modèle d'audit
      • Questions fréquentes
    • Privacy hubs
      • Créer un Privacy hub
      • Paramétrer votre Privacy hub
        • Page d'accueil et configuration générale
        • Questionnaires
        • Exercice des droits
        • Registre des traitements
        • Documents
        • Organigramme
        • Contacts
        • Sécurité
        • Apparence et design
      • Prévisualiser et partager votre Privacy hub
      • Collecter des projets de traitements, d'incidents, d'actifs ou de contrats
    • Contrats
      • Déclarer un contrat
      • Structure d'un contrat
      • Les documents
      • Les actifs
      • Les signataires
      • Utilisateurs associés
      • Signer le contrat
      • Intégration avec Docusign
      • Versionner le contrat
      • Revue régulière du contrat
      • Modèles de contrats dynamiques
    • Gestion des risques
      • Glossaire
      • Le processus de gestion des risques
        • 1. Identifier
        • 2. Evaluer
        • 3. Maîtriser
        • 4. Contrôler
        • Récapitulons
      • Comparaison Dastra / eBios RM
      • Associer un risque à un traitement
      • Questions fréquentes
    • Planification
      • Créez ou modifier une tâche
      • Créer ou modifier un projet ou une itération
      • Suivre, filtrer ou exporter les tâches
      • Personnaliser le workflow des tâches
      • Synchroniser avec d'autres calendriers
      • Questions fréquentes
    • Exercices des droits
      • Gestion des demandes d'exercices de droits
      • Formulaire de collecte de demandes
      • Intégration technique
      • Intégration de l'API
    • Violations de données
      • Documenter une nouvelle violation de données
      • Exportez vos violations de données
    • Cookies
      • Mise en place de la bannière
        • Etude préliminaire
        • Scannez les cookies déposés sur votre site Web
        • Classifiez les cookies par catégories de consentement
        • Les finalités des cookies
        • Configurez un widget de consentement aux cookies
        • Collectez les preuves de consentement cookies
        • Allez plus loin sur le consentement des cookies
        • En cas d'indisponibilité
      • Intégration technique
        • Fonctionnement de la bannière
        • Démarrage rapide
          • Wordpress
        • Gestion de la langue
        • Tester l'intégration d'un widget
        • Blocage des cookies
          • Blocage des iframes (twitter/youtube...)
          • Google Tag Manager
        • Design avancé
        • Gérer le consentement programmatiquement
        • Identification des utilisateurs
        • Applications mobiles
          • Applications hybrides
          • Applications natives
        • TCF 1.1/2.0
      • Conformité RGAA
      • Dépannage
    • Revue régulière (fraicheur)
    • Rapports personnalisés
      • Intégration dans les outils d'analyse de données (BI)
    • Systèmes d'IA
      • Etablir un registre des Systèmes d'IA
      • Analyse de risque et valeur ajoutée
      • Notice de transparence
      • Le référentiel des modèles d'IA
    • Configuration avancée
      • Rôles et permissions
      • Single Sign On (SSO)
        • SAML 2
        • OpenId
        • ADFS
        • Active Directory (MS Entra)
        • Okta
        • Problèmes connus
      • SCIM
      • Gestion des clés d'API
      • Notifications
      • Adresses emails de collecte
      • Intégrations OneDrive/Google Drive
      • Etapes de processus
      • Webhooks
      • Configuration du SMTP
      • Règles de workflows
      • Modèles de messages
      • Domaines emails
  • PARTENAIRES
    • Portail partenaire
  • 📄La documentation API
    • Liste des endpoints d'API
    • Cas d'usage de l'API
    • Configuration API
    • Authentification
    • API References
    • Intégrations via Zapier
      • Questions fréquentes
  • 🛡️La sécurité
    • Sécurité chez Dastra
    • Authentification forte
    • Qualité de nos services
  • Certifications
  • 🤖DIVERS
    • Foire aux questions
    • Problèmes connus
    • Notes de version
    • Webinaires
Propulsé par GitBook
Sur cette page

Cet article vous a-t-il été utile ?

  1. Les fonctionnalités
  2. Configuration avancée

Webhooks

Vous saurez tout sur l'intégration de webhooks dans Dastra

Dernière mise à jour il y a 10 mois

Cet article vous a-t-il été utile ?

Concept 👓

Pour faire simple, les webhooks permettent de déclencher une action suite à un événement. Ils sont généralement utilisés pour faire communiquer des systèmes. C’est la façon la plus simple de recevoir une alerte lorsque quelque chose se produit dans Dastra. L'objectif est de notifier des applications tierces (API, CRM, Fonctions serverless...) en temps réel.

Configuration 🛠️

  • Cliquez sur créer une "url de webhook"

  • Renseignez l'espace de travail concerné

  • Sélectionnez le ou les évènements auxquels vous souhaitez vous abonner. Le type de données renvoyés sera différent selon le type d'évènement. Par exemple, vous pouvez déclencher le webhook lors de la création d'une nouvelle demande d'exercice de droit. Dans ce cas le body de la requête contiendra un json

  • Enregistrez le webhook

Vous arrivez sur l'écran de détail du webhook.

Comment réceptionner le webhook 🛬

Pour réceptionner les requêtes du webhook, vous devez créer un endpoint d'API de captation de l'évènement. La requête effectuée est en POST et sera toujours structurée de cette façon. Le body de la requête contient un json avec le détail de l'évènement déclenché.

Voici la structure générale de la réponse envoyée :

{
 "webhookId": <id of the webhook configured in dastra>,
 "signatureUrl": "https://yourapi.com/webhooks/handle",
 "userId": <The user whot triggered the event>,
 "eventType": <The id of the event>,
 "eventName": <The label of the event>,
 "data": <Event dynamic data>,
 "date": <date of the event>
} 

Un timeout de 10 secondes est appliqué sur la requête, au delà de ce temps la requête sera en erreur. Il est nécessaire que le code de réponse soit 200.

Il peut y avoir un petit délai entre le moment où l'évènement a lieu dans l'application et le déclenchement du webhooks (ce délai est lié à la nature asynchrone de l'exécution du webhook dans notre infrastructure). Ce délai est plus ou moins important selon la charge de notre infrastructure et peut aller jusque 60-120 secondes maximum.

Il n'existe pour l'instant aucun système permettant de rejouer les webhooks qui ont échoués et donc de compenser une éventuelle indisponibilité des serveurs de réception des webhooks. Dans ce cas, nous vous recommandons d'effectuer une synchronisation manuelle des évènements qui ont échoué.

Tester votre url de webhooks 🧪

Vous allez pouvoir tester votre webhook en condition réelle en cliquant sur le bouton "Tester".

Comment sécuriser le webhook ? 🛡️

Même si ce n'est pas une obligation, il est recommandé de valider la requête entrante du webhook pour éviter les attaques potentielles d'un hackeur qui aurait sniffé le réseau et serait ainsi en capacité de poster n'importe quoi sur votre url de webhook et ainsi déclencher ou spammer la création d'éléments dans votre système.

Chaque fois qu'une requête de modification, suppression d'un élément de Dastra est effectuée, nous allons poster un objet sur toutes les urls que vous avez configurés sur l'évènement voulu. Dans chaque requête POST figurera une entête Dastra-Signature, cette entête peut être récupérée côté serveur.

Cette entête correspond à l'intégralité du JSON posté est hashé à l'aide de l'algorithme HMAC-Sha256 à l'aide de la clé de validation du webhook.

DastraSignature = HMAC256(<JSON sérialisé du POST>,<clé de validation du webhook>)

Voici quelques exemples de validation de la signature de la requête :

error_reporting(E_ALL);
ini_set('display_errors', 1); 
c
$secret = "your dastra validation key";// your secret key
$payload = "";// equest body
$headers = "";// request message headers array

$signature = "";// the HMAC hash key in the HTTP header 'Dastra-Signature'
$result = false;// verification result

if (isset($_POST)) {
    try {
        $payload = file_get_contents('php://input');
        $headers = get_ds_headers();
        if (array_key_exists("Dastra-Signature", $headers)) {
            $signature = $headers["Dastra-Signature"];
            $result = hash_is_valid($secret, $payload, $signature);
            log_result($signature, $payload, $result);
        }
     } catch (Exception $e) {
        logger("\nException: " . $e->getMessage() . "\n");
    }
    header("HTTP/1.1 200 OK");
}

function get_ds_headers()
{
    $headers = array();
    foreach ($_SERVER as $key => $value) {
        if (strpos($key, 'HTTP_') === 0) {
            $headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
        }
    }
    return $headers;
}
 
function compute_hash($secret, $payload)
{
    $hexHash = hash_hmac('sha256', $payload, utf8_encode($secret));
    $base64Hash = base64_encode(hex2bin($hexHash));
    return $base64Hash;
}
 
function hash_is_valid($secret, $payload, $verify)
{
    $computed_hash = compute_hash($secret, $payload);
     return hash_equals($verify,$computed_hash);
 }

[HttpPost]
public IActionResult Handle(){
    string dastraSignature = Request.Headers["Dastra-Signature"];
    string key = "Your validation key";
    string payload = GetRequestBody();
}

private static bool ValidateSignature(string signature, string payload, string secret)
{
    using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
    {
        var hash = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(payload));
        var result = Convert.ToBase64String(hash);
    }
    
    return result.Equals(signature)
}

private static string GetRequestBody()
{
    var bodyStream = new StreamReader(Request.InputStream);
    bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
    var bodyText = bodyStream.ReadToEnd();
    return bodyText;
}

Que se passe-t-il quand l'url répond autre chose que 200

Le webhook sera automatiquement bloqué et considéré en erreur quand le seuil de 5 erreurs est dépassé.

Comment mettre en place des webhooks avec les API

Récupérer les webhooks liés à votre compte (dans tous les espaces de travail)

Créez une nouvelle url de webhook en utilisant le endpoint POST. Renseignez les évènements auxquels vous souhaitez abonner votre webhook avec le paramètre subscribedEvents webhooks.

Un identifiant de webhook vous sera retourné

Pour configurer vos webhooks, rendez-vous sur la page :

Renseignez l'url de réception de votre webhook. Pour en savoir plus consultez la section .

⚙️
https://app.dastra.eu/general-settings/webhooks
Comment réceptionner le webhook

Get all webhooks urls configured in workspace

get
Autorisations
Paramètres de requête
workspaceIdinteger · int32Optionnel
Réponses
200
Success
application/json
get
GET /v1/WebHookUrls HTTP/1.1
Host: api.dastra.eu
Accept: */*
200

Success

[
  {
    "signatureKey": "123e4567-e89b-12d3-a456-426614174000",
    "errorMessage": "text",
    "nbErrors": 1,
    "dateLastError": "2025-05-10T10:13:12.937Z",
    "inError": true,
    "workSpace": {
      "id": 1,
      "tenantId": 1,
      "primaryColor": "text",
      "secondaryColor": "text",
      "label": "text",
      "logoUrl": "text",
      "state": "Active",
      "permissions": [
        {
          "name": "text",
          "tenantId": 1,
          "workSpaceId": 1,
          "shortName": "text"
        }
      ],
      "dataSubjectArchivedRetentionDays": 1,
      "nbEntities": 1
    },
    "id": 1,
    "url": "text",
    "workSpaceId": 1,
    "subscribedEvents": [
      "ProcessingCreation"
    ]
  }
]

Get webhook by id

get
Autorisations
Paramètres de chemin
idinteger · int32Requis
Réponses
200
Success
application/json
get
GET /v1/WebHookUrls/{id} HTTP/1.1
Host: api.dastra.eu
Accept: */*
200

Success

{
  "signatureKey": "123e4567-e89b-12d3-a456-426614174000",
  "errorMessage": "text",
  "nbErrors": 1,
  "dateLastError": "2025-05-10T10:13:12.937Z",
  "inError": true,
  "workSpace": {
    "id": 1,
    "tenantId": 1,
    "primaryColor": "text",
    "secondaryColor": "text",
    "label": "text",
    "logoUrl": "text",
    "state": "Active",
    "permissions": [
      {
        "name": "text",
        "tenantId": 1,
        "workSpaceId": 1,
        "shortName": "text"
      }
    ],
    "dataSubjectArchivedRetentionDays": 1,
    "nbEntities": 1
  },
  "id": 1,
  "url": "text",
  "workSpaceId": 1,
  "subscribedEvents": [
    "ProcessingCreation"
  ]
}

Delete webhook url

delete
Autorisations
Paramètres de chemin
idinteger · int32Requis
Réponses
200
Success
delete
DELETE /v1/WebHookUrls/{id} HTTP/1.1
Host: api.dastra.eu
Accept: */*
200

Success

Aucun contenu

  • Concept 👓
  • Configuration 🛠️
  • Comment réceptionner le webhook 🛬
  • Tester votre url de webhooks 🧪
  • Comment sécuriser le webhook ? 🛡️
  • Que se passe-t-il quand l'url répond autre chose que 200
  • Comment mettre en place des webhooks avec les API
  • GETGet all webhooks urls configured in workspace
  • POSTPost a new webhook url
  • GETGet webhook by id
  • DELETEDelete webhook url

Post a new webhook url

post
Autorisations
Corps
idinteger · int32Optionnel
urlstringRequis
workSpaceIdinteger · int32 | nullableOptionnel
Réponses
200
Success
application/json
post
POST /v1/WebHookUrls HTTP/1.1
Host: api.dastra.eu
Content-Type: application/json-patch+json
Accept: */*
Content-Length: 79

{
  "id": 1,
  "url": "text",
  "workSpaceId": 1,
  "subscribedEvents": [
    "ProcessingCreation"
  ]
}
200

Success

{
  "signatureKey": "123e4567-e89b-12d3-a456-426614174000",
  "errorMessage": "text",
  "nbErrors": 1,
  "dateLastError": "2025-05-10T10:13:12.937Z",
  "inError": true,
  "workSpace": {
    "id": 1,
    "tenantId": 1,
    "primaryColor": "text",
    "secondaryColor": "text",
    "label": "text",
    "logoUrl": "text",
    "state": "Active",
    "permissions": [
      {
        "name": "text",
        "tenantId": 1,
        "workSpaceId": 1,
        "shortName": "text"
      }
    ],
    "dataSubjectArchivedRetentionDays": 1,
    "nbEntities": 1
  },
  "id": 1,
  "url": "text",
  "workSpaceId": 1,
  "subscribedEvents": [
    "ProcessingCreation"
  ]
}