Podczas konfigurowania adresu URL webhooka w swoim wysięgnik ustawienia integracji – nasz system automatycznie wyśle POST wysyłać żądanie z wynikami zebranymi przez scraper na ten adres URL za każdym razem, gdy zadanie/żądanie zostanie zakończone.

Ze względów bezpieczeństwa każda treść webhooka jest podpisywana przy użyciu Twój klucz API Outscraper. Dzięki temu możesz sprawdzić, czy webhook rzeczywiście pochodzi z Outscraper i nie został zmodyfikowany.

Krok 1. Nagłówek podpisu

Każde żądanie typu webhook zawiera dodatkowy nagłówek:

				
					X-Hub-Signature-256: sha256=<signature>
				
			
  • <signature> jest skrótem HMAC-SHA256 surowej treści JSON.

  • Jest on generowany przy użyciu Twój klucz API Outscraper.

  • Aby zweryfikować autentyczność, należy obliczyć ten sam skrót lokalnie i porównać go z danymi zawartymi w nagłówku.

Krok 2. Przykładowe żądanie webhooka

Oto jak wygląda prawdziwe żądanie typu 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
    }
  ]
}

				
			

Krok 3. Weryfikacja

Aby zweryfikować żądanie webhooka, należy:

  1. Przeczytaj surowa treść JSON (nie obiekt poddany analizie).

  2. Oblicz skrót HMAC-SHA256 tej treści przy użyciu swojego Klucz API.

  3. Dodaj na początku "sha256=" i porównać z wartością podaną w X-Hub-Signature-256 nagłówek.

  4. Odrzuć wniosek, jeśli podpisy się nie zgadzają.

Przykład w języku 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

				
			

Przykład wykorzystania 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"));

				
			

Przykład w języku 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";

				
			

Krok 4. Co zrobić, jeśli weryfikacja się nie powiedzie

Jeśli obliczony podpis nie zgadza się z nagłówkiem:

  • Odrzuć wniosek (401 Unauthorized).

  • Zarejestruj tę próbę na potrzeby debugowania/audytu.

  • Nie należy przetwarzać danych użytkowych.

Krok 5. Testowanie

Możesz przetestować swoją logikę weryfikacji, uruchamiając webhook z serwisu Outscraper.
Podpis będzie zawsze poprawnie weryfikowany, o ile użyjesz swojego Klucz API.

Podsumowanie

  • Wszystkie webhooki Outscraper są podpisywane przy użyciu Twój klucz API.

  • Zweryfikuj żądania poprzez obliczenia:

    sha256(HMAC(api_key, raw_payload))
  • Porównaj obliczony skrót z X-Hub-Signature-256 nagłówek.

  • Aby zapewnić bezpieczeństwo systemu, należy przetwarzać wyłącznie zweryfikowane żądania.

Bibliografia

Metoda Outscraper stosuje to samo podejście, z którego korzystają największe platformy w celu weryfikacji autentyczności webhooków:

Przykłady te pokazują, że weryfikacja podpisów webhooków za pomocą algorytmu HMAC-SHA256 stanowi standardowy sposób potwierdzania autentyczności i zapobiegania manipulacjom.