Lorsque vous configurez une URL de webhook dans votre Outscraper notre système enverra automatiquement un POST avec les résultats de l'analyse à cette URL chaque fois qu'une tâche/requête est terminée.

Pour des raisons de sécurité, chaque charge utile du webhook est signée à l'aide de l'option votre clé API Outscraper. Cela vous permet de vérifier que le webhook provient bien de Outscraper et qu'il n'a pas été modifié.

Étape 1. En-tête de signature

Chaque demande de webhook comprend un en-tête supplémentaire :

				
					X-Hub-Signature-256: sha256=<signature>
				
			
  • <signature> est un condensé HMAC-SHA256 de la charge utile JSON brute.

  • Il est généré à l'aide de votre clé API Outscraper.

  • Pour vérifier l'authenticité, vous devez calculer le même condensé localement et le comparer à l'en-tête.

Étape 2. Exemple de demande de Webhook

Voici à quoi ressemble une vraie demande de webhook :

				
					POST /webhooks HTTP/1.1
Host: your-domain.com
Content-Type: application/json
X-Hub-Signature-256: sha256=7b6b9d07b1c0d7ff3b4b3fcecbf9c08a5f6c2a248ef12c7a37a7269d3a5b1b93

{
  "id": "your-request-id",
  "user_id": "your-user-id",
  "status": "SUCCESS",
  "api_task": true,
  "results_location": "https://api.outscraper.cloud/requests/your-request-id",
  "quota_usage": [
    {
      "product_name": "Google Maps Data",
      "quantity": 1
    }
  ]
}

				
			

Étape 3. Vérification

Pour vérifier une demande de webhook, vous devez :

  1. Lire le charge utile JSON brute (et non l'objet analysé).

  2. Calculer un condensé HMAC-SHA256 de cette charge utile à l'aide de votre Clé API.

  3. Le faire précéder de "sha256=" et la comparer à la valeur de la X-Hub-Signature-256 l'en-tête.

  4. Rejeter la demande si les signatures ne correspondent pas.

Exemple Python

				
					import hmac
import hashlib
import json
from flask import Flask, request, abort

app = Flask(__name__)

API_KEY = "your_api_key_here"  # your Outscraper API key

def generate_hmac_sha256(secret: str, data: str) -> str:
    return hmac.new(secret.encode("utf-8"), data.encode("utf-8"), hashlib.sha256).hexdigest()

@app.route("/webhooks", methods=["POST"])
def webhook():
    # Raw JSON payload as text
    payload = request.get_data(as_text=True)
    # Signature header from Outscraper
    signature_header = request.headers.get("X-Hub-Signature-256", "")

    # Compute expected signature
    expected_signature = "sha256=" + generate_hmac_sha256(API_KEY, payload)

    # Secure comparison
    if not hmac.compare_digest(signature_header, expected_signature):
        abort(401, "Invalid signature")

    data = json.loads(payload)
    print("Verified payload:", data)

    return "ok", 200

				
			

Exemple Node.js

				
					const crypto = require("crypto");
const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf.toString() } }));

const API_KEY = "your_api_key_here"; // your Outscraper API key

function generateHmacSha256(secret, data) {
  return crypto.createHmac("sha256", secret).update(data, "utf8").digest("hex");
}

app.post("/webhooks", (req, res) => {
  const signature = req.headers["x-hub-signature-256"];
  const expected = "sha256=" + generateHmacSha256(API_KEY, req.rawBody);

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).send("Invalid signature");
  }

  console.log("Verified payload:", req.body);
  res.send("ok");
});

app.listen(3000, () => console.log("Webhook listener running on port 3000"));

				
			

Exemple PHP

				
					<?php
$API_KEY = "your_api_key_here"; // your Outscraper API key

// Get raw POST body
$payload = file_get_contents("php://input");

// Get signature from headers
$signatureHeader = $_SERVER["HTTP_X_HUB_SIGNATURE_256"] ?? "";

// Compute expected signature
$expectedSignature = "sha256=" . hash_hmac("sha256", $payload, $API_KEY);

// Compare securely
if (!hash_equals($expectedSignature, $signatureHeader)) {
    http_response_code(401);
    die("Invalid signature");
}

// Decode and process verified payload
$data = json_decode($payload, true);
error_log("Verified payload: " . print_r($data, true));

http_response_code(200);
echo "ok";

				
			

Étape 4. Que faire en cas d'échec de la vérification ?

Si la signature calculée ne correspond pas à l'en-tête :

  • Rejeter la demande (401 Unauthorized).

  • Enregistrer la tentative pour le débogage/l'audit.

  • Ne pas traiter la charge utile.

Étape 5. Test

Vous pouvez tester votre logique de vérification en déclenchant un webhook depuis Outscraper.
La signature sera toujours validée correctement tant que vous utiliserez votre Clé API.

Résumé

  • Tous les webhooks de Outscraper sont signés à l'aide de votre clé API.

  • Vérifier les demandes par informatique :

    sha256(HMAC(api_key, raw_payload))
  • Comparer le condensé calculé avec le X-Hub-Signature-256 l'en-tête.

  • Ne traitez que les demandes vérifiées afin de préserver la sécurité de votre système.

Références

La méthode utilisée par Outscraper est la même que celle utilisée par les principales plateformes pour vérifier l'authenticité des webhooks :

Ces exemples montrent que la vérification des signatures des webhooks avec HMAC-SHA256 est le moyen standard de confirmer l'authenticité et d'empêcher la falsification.

Catégories : APIPyhtonTutoriels

Vlad

Chef de projet Linkedin