Коли ви налаштовуєте URL-адресу веб-хука у вашому Outscraper налаштувань інтеграції, наша система автоматично відправить POST з вилученими результатами на цю URL-адресу щоразу, коли завдання/запит буде завершено.

Для безпеки кожне корисне навантаження веб-хука підписується за допомогою ваш ключ API Outscraper. Це дозволить вам переконатися, що веб-хук дійсно походить від Outscraper і не був змінений.

Крок 1. Заголовок підпису

Кожен запит webhook містить додатковий заголовок:

				
					X-Hub-Signature-256: sha256=<signature>
				
			
  • <signature> це HMAC-SHA256-дайджест необробленого JSON-даних.

  • Він генерується за допомогою ваш ключ API Outscraper.

  • Щоб перевірити автентичність, потрібно обчислити той самий дайджест локально і порівняти його із заголовком.

Крок 2. Приклад запиту 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
    }
  ]
}

				
			

Крок 3. Перевірка

Щоб підтвердити запит на веб-хук, ви повинні:

  1. Прочитайте сирий JSON-вантаж (а не об'єкт синтаксичного аналізу).

  2. Обчисліть дайджест HMAC-SHA256 цього корисного навантаження, використовуючи ваш Ключ API.

  3. Приготуйте його за допомогою "sha256=" і порівняйте зі значенням у X-Hub-Signature-256 заголовок.

  4. Відхилити запит, якщо підписи не збігаються.

Приклад на 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

				
			

Приклад 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"));

				
			

Приклад 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";

				
			

Крок 4. Що робити, якщо верифікація не пройшла

Якщо обчислений підпис не збігається із заголовком:

  • Відхилити запит (401 Unauthorized).

  • Зафіксуйте спробу налагодження/аудиту.

  • Не обробляйте корисне навантаження.

Крок 5. Тестування

Ви можете протестувати логіку перевірки, запустивши веб-хук від Outscraper.
Підпис завжди буде коректно підтверджено, якщо ви використовуєте свій обліковий запис Ключ API.

Підсумок

  • Всі веб-хуки Outscraper підписані за допомогою ваш ключ API.

  • Перевіряйте запити за допомогою обчислень:

    sha256(HMAC(api_key, raw_payload))
  • Порівняйте розрахований дайджест з X-Hub-Signature-256 заголовок.

  • Обробляйте лише перевірені запити, щоб захистити вашу систему.

Посилання

Метод, який використовує Outscraper, - це той самий підхід, якому довіряють більшість платформ для перевірки автентичності веб-хуків:

Ці приклади показують, що перевірка підписів веб-хуків за допомогою HMAC-SHA256 є стандартним способом підтвердження автентичності та запобігання підробці.


Влад

Керівник проекту Linkedin