> ## Documentation Index
> Fetch the complete documentation index at: https://storekit.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Vérifier les signatures

> Sécurisez vos webhooks en vérifiant la signature HMAC de chaque requête. Confirmez que les payloads proviennent bien de storekit et n'ont pas été altérés durant le transit.

Vérifier les signatures des webhooks est essentiel pour la sécurité. Cela garantit que le webhook provient bien de storekit et qu'il n'a pas été altéré.

## Pourquoi vérifier ?

Puisque votre endpoint webhook est accessible publiquement, n'importe qui pourrait lui envoyer des requêtes en se faisant passer pour storekit. La vérification de signature empêche :

* **Les requêtes falsifiées** : des attaquants envoyant de faux webhooks
* **Les attaques par rejeu** : d'anciens webhooks renvoyés de manière malveillante
* **L'altération des données** : la modification des payloads webhook en transit

## Utiliser les bibliothèques Svix (recommandé)

Nous recommandons d'utiliser les bibliothèques officielles Svix pour la vérification, qui gèrent toute la complexité pour vous :

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Webhook } from 'svix';

  const wh = new Webhook(process.env.WEBHOOK_SECRET);

  try {
    const payload = wh.verify(rawBody, headers);
    // Process the verified payload
  } catch (err) {
    // Signature verification failed
    return res.status(400).send('Invalid signature');
  }
  ```

  ```python Python theme={null}
  from svix.webhooks import Webhook

  wh = Webhook(os.environ['WEBHOOK_SECRET'])

  try:
      payload = wh.verify(raw_body, headers)
      # Process the verified payload
  except Exception as e:
      # Signature verification failed
      return Response(status=400)
  ```

  ```go Go theme={null}
  import svix "github.com/svix/svix-webhooks/go"

  wh, _ := svix.NewWebhook(os.Getenv("WEBHOOK_SECRET"))

  err := wh.Verify([]byte(rawBody), headers)
  if err != nil {
      // Signature verification failed
      return
  }
  ```
</CodeGroup>

<Warning>
  Utilisez toujours le corps brut de la requête pour la vérification. Si vous parsez d'abord le JSON puis le stringifiez à nouveau, la signature ne correspondra pas en raison de différences de formatage potentielles.
</Warning>

## Vérification manuelle

Si vous préférez vérifier les signatures manuellement sans utiliser la bibliothèque Svix, suivez les étapes ci-dessous.

### En-têtes de signature

Chaque webhook inclut les en-têtes suivants pour la vérification :

| En-tête          | Description                           |
| ---------------- | ------------------------------------- |
| `svix-id`        | Identifiant unique du message         |
| `svix-timestamp` | Horodatage Unix de l'envoi du message |
| `svix-signature` | La (les) signature(s) à vérifier      |

## Étapes de vérification

### 1. Extraire les en-têtes

```javascript theme={null}
const svixId = request.headers['svix-id'];
const svixTimestamp = request.headers['svix-timestamp'];
const svixSignature = request.headers['svix-signature'];
```

### 2. Vérifier l'horodatage (empêcher les attaques par rejeu)

Rejetez les webhooks dont l'horodatage est plus ancien que 5 minutes :

```javascript theme={null}
const tolerance = 5 * 60; // 5 minutes in seconds
const now = Math.floor(Date.now() / 1000);
const timestamp = parseInt(svixTimestamp, 10);

if (Math.abs(now - timestamp) > tolerance) {
  throw new Error('Webhook timestamp too old');
}
```

### 3. Créer le contenu signé

Concaténez l'ID du webhook, l'horodatage et le corps :

```javascript theme={null}
const signedContent = `${svixId}.${svixTimestamp}.${rawBody}`;
```

### 4. Calculer la signature attendue

Utilisez HMAC-SHA256 avec votre secret webhook :

```javascript theme={null}
const crypto = require('crypto');

// Your secret from the dashboard (remove the 'whsec_' prefix)
const secret = Buffer.from(secretKey.split('_')[1], 'base64');

const expectedSignature = crypto
  .createHmac('sha256', secret)
  .update(signedContent)
  .digest('base64');
```

### 5. Comparer les signatures

```javascript theme={null}
const signatures = svixSignature.split(' ');
const isValid = signatures.some(sig => {
  const [version, signature] = sig.split(',');
  return version === 'v1' && signature === expectedSignature;
});

if (!isValid) {
  throw new Error('Invalid webhook signature');
}
```


## Related topics

- [Guide de mappage des PLU](/docs/fr/guides/integrations/pos/advanced/plu-mapping.md)
- [Aperçu des webhooks](/docs/fr/developers/webhooks/overview.md)
- [Format du payload](/docs/fr/developers/webhooks/payload-format.md)
- [Introduction pour les développeurs](/docs/fr/developers/introduction.md)
- [Délivrabilité des e-mails](/docs/fr/guides/notifications/email-deliverability.md)
