Si la cible d’un webhook est accessible au public, il faut s’assurer, pour les requêtes entrantes, qu’elles proviennent du système d’origine souhaité. L’origine d’un webhook peut être garantie à l’aide d’une clé secrète.

Pour créer un nouveau webhook, il suffit d’indiquer une URL quelconque. La clé secrète peut également rester vide. Toutefois, si votre URL cible est disponible publiquement, vous devez définir une clé secrète et valider cette valeur lors du traitement des webhooks. Dans le cas contraire, n’importe qui peut vous envoyer des demandes correspondantes à cette URL de webhook, qui seront ensuite traitées par vous. Sans la clé secrète, le système cible n’a aucun moyen fiable de savoir si l’événement provient réellement de SeaTable.

Si vous indiquez une clé secrète, le webhook dispose d’une clé supplémentaire. X-SeaTable-Signature-Header_Il s’agit d’une clé secrète qui permet de garantir l’origine du webhook. Tant que quelqu’un d’autre ne connaît pas la clé secrète, il n’est pas en mesure de vous envoyer des événements par webhook et d’utiliser la clé correspondante. _X-SeaTable-Signature-Header de produire.

Lorsqu’une clé secrète est définie, une requête de webhook ressemble par exemple à ceci :

-- 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: []
  }
}

La clé secrète est un secret partagé entre SeaTable et le système récepteur. SeaTable utilise la clé secrète pour calculer une valeur de hachage à partir de l’événement. Le système récepteur peut utiliser la clé secrète pour calculer le contenu à partir de la valeur de hachage et le comparer au contenu réel. Si le contenu réel ne correspond pas au contenu calculé à partir du hachage, il ne faut pas traiter le webhook.

Dans chaque langage de programmation, il devrait y avoir des fonctions correspondantes pour pouvoir valider une telle signature en conséquence. Cet article vous montre à quoi ressemblerait cette vérification en PHP.

Pour Python, un examen pourrait ressembler à ceci :

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}