Signierungsparameter für Discourse in Webhooks

Hallo. Ich möchte Discourse-Webhooks nutzen, wenn ein Benutzer erstellt oder aktualisiert wird, aber ich möchte den von Discourse gesendeten Daten vertrauen können. Gibt es eine Möglichkeit, einen öffentlichen/geheimen Schlüssel oder zumindest einen symmetrischen Geheimschlüssel zu unterstützen, den ich zur Verifizierung der signierten Nutzlast verwenden kann? Können wir einen Standardrahmen für die Signierung aller Nutzlasten und eine Standard-PHP-Implementierung bereitstellen, um die Signatur zu serialisieren und zu verifizieren?

Facebook macht das, wenn es Informationen über einen Benutzer sendet. Dies würde anderen Softwarelösungen ermöglichen, sich mit Discourse-Benutzern und anderen Objekten zu integrieren.

Kommt der Webhook-Geheimschlüssel dem nahe, wonach du suchst? So verifiziert das WP Discourse-Plugin ihn gegenüber dem Webhook-Geheimschlüssel, der in WordPress festgelegt wird:

public function verify_discourse_webhook_request( $data ) {
	$options = $this->get_options();
	// Die X-Discourse-Event-Signature besteht aus 'sha256=' . HMAC des Rohinhalts.
	// Sie wird durch Berechnung von `hash_hmac( 'sha256', $payload, $secret )` erzeugt.
	$sig = substr( $data->get_header( 'X-Discourse-Event-Signature' ), 7 );
	if ( $sig ) {
		$payload = $data->get_body();
		// Schlüssel zur Verifizierung der Anfrage – ein entsprechender Schlüssel muss im Discourse-Webhook festgelegt sein.
		$secret = ! empty( $options['webhook-secret'] ) ? $options['webhook-secret'] : '';

		if ( ! $secret ) {

			return new \WP_Error( 'discourse_webhook_configuration_error', 'Der Webhook-Geheimschlüssel wurde nicht festgelegt.' );
		}

		if ( hash_hmac( 'sha256', $payload, $secret ) === $sig ) {

			return $data;
		} else {

			return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse-Webhook-Anfragefehler: Signaturen stimmen nicht überein.' );
		}
	}

	return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse-Webhook-Anfragefehler: Die X-Discourse-Event-Signature wurde für die Anfrage nicht festgelegt.' );
}
3 „Gefällt mir“