ReOTP.
Ασφάλεια και Συγχρονισμός/Webhooks (Ιστορικά) και HMAC
1 λεπτά ανάγνωσης

Webhooks (Ιστορικά) και HMAC

Μάθετε πώς να λαμβάνετε ασφαλείς άμεσες ειδοποιήσεις κατά την επαλήθευση ενός τηλεφωνικού αριθμού.

Τα Webhooks είναι η πιο γρήγορη και ασφαλής μέθοδος για να είτε σίγουρος ότι ο χρήστης έχει επαληθεύσει επιτυχώς χωρίς την ανάγκη SSE (Server-Sent Events) (συνεχής έλεγχος).

Όταν ο χρήστης αποστέλλει το μήνυμα και επιτυγχάνεται η αντιστοιχία, το σύστημά μας στέλνει ένα αίτημα POST σε μια διεύθυνση (URL) που έχετε ορίσει εκ των προτιμήσεων στις ρυθμίσεις του έργου.

Ασφάλεια Webhooks (HMAC Signature)

Για να εξασφαλίσετε ότι τα αιτήματα έρχονται πραγματικά από τους διακομιστές μας και όχι από επιθέσεις, υπογράφουμε κάθε αίτημα χρησιμοποιώντας την αλγόριθμο HMAC-SHA256.

1. Μεταβείτε στις ρυθμίσεις του έργου και δημιουργήστε Webhook Secret.

2. Θα συνδεθεί η κρυπτογραφημένη υπογραφή στον κεφάλαιο του αιτήματος (Header) με το όνομα x-webhook-signature.

3. Πρέπει να υπολογίσετε την υπογραφή στον διακομιστή σας χρησιμοποιώντας το ίδιο το Secret του Webhook και να την συγκρίνετε με την παραλαμβανόμενη υπογραφή.

Κώδικας ενσωμάτωσης (SDKs)
const express = require('express');
const crypto = require('crypto');
const app = express();

const WEBHOOK_SECRET = 'your_webhook_secret_here';

// Must parse raw body to verify signature correctly
app.use(express.json());

app.post('/webhook/reotp', (req, res) => {
  const signatureHeader = req.headers['x-webhook-signature'];
  const payloadString = JSON.stringify(req.body);

  // Calculate HMAC SHA256
  const expectedSignature = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(payloadString)
    .digest('hex');

  // Securely compare signatures
  if (signatureHeader !== expectedSignature) {
    return res.status(401).send('Invalid signature');
  }

  // Handle successful verification
  const { event, phoneNumber, requestId } = req.body;
  if (event === 'verification.success') {
    console.log(`User ${phoneNumber} verified! (ID: ${requestId})`);
    // Login user, create session, update DB, etc.
  }

  // Must return 200 OK so we know it was delivered
  res.status(200).send('OK');
});

app.listen(3000, () => console.log('Listening for Webhooks...'));