Если назначение веб-крючка общедоступно, то для входящих запросов необходимо убедиться, что они исходят от нужной системы-исходника. С помощью секретного ключа можно гарантировать происхождение веб-крючка.

Чтобы создать новый webhook, просто введите любой URL. Секретный ключ также может оставаться пустым. Однако если ваш целевой URL-адрес общедоступен, вам следует установить секретный ключ и подтвердить это значение при обработке веб-крючков. В противном случае любой может отправить вам соответствующие запросы на этот URL webhook, которые затем будут обработаны вами. Без секретного ключа у целевой системы не будет надежного способа распознать, действительно ли событие пришло от SeaTable.

Если вы укажете секретный ключ, веб-крючок будет иметь дополнительный X-SeaTable-Signature-Headerкоторый может быть использован для обеспечения происхождения webhook. Пока кто-то другой не знает секретный ключ, он не сможет отправить вам события через webhook и найти подходящий ключ. X-SeaTable-Signature-Header производить.

Если установлен секретный ключ, запрос webhook выглядит, например, так:

-- HEADER --
Content-Type: application/json
Content-Length: 625
X-Seatable-Signature: sha256=598b55485e7875def064746867ff220e79d7c75512fdb931a39e313af5abfe60
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: python-requests/2.28.1
Host: example.com

-- CONTENT --
{
  event:update
  data: {
    dtable_uuid: 6c17f178ee724c109c68ecee364027fc
    row_id: Y_aYcE6wTo-IzGWb-oDmaQ
    op_user: 92d8f9b243f8437db0131c2536398403@auth.local
    op_type: create_row
    op_time: 1677595743.088
    table_id: 0000
    table_name: Table1
    row_name: ""
    row_data: []
  }
}

Секретный ключ - это общий секрет между SeaTable и принимающей системой. SeaTable использует секретный ключ для вычисления хэш-значения события. Принимающая система может использовать секретный ключ для обратного вычисления содержимого из хэш-значения и сравнения его с фактическим содержимым. Если фактическое содержимое не совпадает с вычисленным содержимым из хэша, веб-крючок не должен обрабатываться.

В каждом языке программирования должны существовать соответствующие функции для проверки такой подписи. Как выглядит такая проверка в PHP, вы можете узнать из этой статьи .

Для Python экзамен может выглядеть следующим образом:

import hmac
from flask import Flask, request

app = Flask(__name__)

@app.route('/receive-seatable-webhook', methods=['POST'])
def receive-seatable_webhook():
    secret = 'secret'
    seatable_signature = request.headers.get('X-Seatable-Signature', '').replace('sha256=', '')

    signature = hmac.new(
        secret.encode('utf-8'), request.data, digestmod='sha256').hexdigest()

    signature_compare = hmac.compare_digest(signature, seatable_signature)

    if signature_compare:
        # do something
        pass

    return {'success': signature_compare}