Webhooks 中的 Discourse 签名参数

你好。我想在用户创建或更新时使用 Discourse 的 Webhook,但我希望能够信任 Discourse 发送的数据。我们能否支持公钥/私钥,或者至少支持对称密钥,以便我可以验证签名的负载?我们能否制定一个标准框架来为所有负载签名,并提供一个标准的 PHP 实现(例如)来序列化和验证签名?

Facebook 在发送用户信息时就是这样做的。这将允许其他软件与 Discourse 用户及其他对象进行集成。

Webhook 密钥是否接近您想要的?以下是 WP Discourse 插件如何将其与在 WordPress 上设置的 Webhook 密钥进行验证的方法:

public function verify_discourse_webhook_request( $data ) {
	$options = $this->get_options();
	// X-Discourse-Event-Signature 由 'sha256=' 加上原始负载的 HMAC 组成。
	// 它是通过计算 `hash_hmac( 'sha256', $payload, $secret )` 生成的。
	$sig = substr( $data->get_header( 'X-Discourse-Event-Signature' ), 7 );
	if ( $sig ) {
		$payload = $data->get_body();
		// 用于验证请求的密钥——需要在 Discourse Webhook 上设置匹配的密钥。
		$secret = ! empty( $options['webhook-secret'] ) ? $options['webhook-secret'] : '';

		if ( ! $secret ) {

			return new \WP_Error( 'discourse_webhook_configuration_error', '尚未设置 Webhook 密钥。' );
		}

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

			return $data;
		} else {

			return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse Webhook 请求错误:签名不匹配。' );
		}
	}

	return new \WP_Error( 'discourse_webhook_authentication_error', 'Discourse Webhook 请求错误:请求未设置 X-Discourse-Event-Signature。' );
}
3 个赞