Ciao. Vorrei utilizzare i webhook di Discourse quando un utente viene creato o aggiornato, ma mi piacerebbe poter fidarmi dei dati inviati da Discourse. Esiste la possibilità di implementare il supporto per chiavi pubbliche-private o, almeno, una chiave segreta simmetrica che possa essere utilizzata per verificare il payload firmato? Potremmo adottare un framework standard per firmare tutti i payload e un’implementazione standard in PHP, ad esempio, per serializzare e verificare la firma?
Facebook lo fa quando invia informazioni su un utente. Questo permetterebbe ad altri software di integrarsi con gli utenti di Discourse e altri oggetti.
La chiave segreta del Webhook si avvicina a ciò che stai cercando? Ecco come il plugin WP Discourse la verifica rispetto alla chiave segreta del Webhook impostata su WordPress:
public function verify_discourse_webhook_request( $data ) {
$options = $this->get_options();
// L'X-Discourse-Event-Signature è composto da 'sha256=' seguito dall'HMAC del payload grezzo.
// Viene generato calcolando `hash_hmac( 'sha256', $payload, $secret )`.
$sig = substr( $data->get_header( 'X-Discourse-Event-Signature' ), 7 );
if ( $sig ) {
$payload = $data->get_body();
// Chiave utilizzata per verificare la richiesta: una chiave corrispondente deve essere impostata sul webhook di Discourse.
$secret = ! empty( $options['webhook-secret'] ) ? $options['webhook-secret'] : '';
if ( ! $secret ) {
return new \WP_Error( 'discourse_webhook_configuration_error', 'La chiave segreta del webhook non è stata impostata.' );
}
if ( hash_hmac( 'sha256', $payload, $secret ) === $sig ) {
return $data;
} else {
return new \WP_Error( 'discourse_webhook_authentication_error', 'Errore nella richiesta del webhook di Discourse: le firme non corrispondono.' );
}
}
return new \WP_Error( 'discourse_webhook_authentication_error', 'Errore nella richiesta del webhook di Discourse: l''X-Discourse-Event-Signature non è stata impostata per la richiesta.' );
}