你好。我想在用户创建或更新时使用 Discourse 的 Webhook,但我希望能够信任 Discourse 发送的数据。我们能否支持公钥/私钥,或者至少支持对称密钥,以便我可以验证签名的负载?我们能否制定一个标准框架来为所有负载签名,并提供一个标准的 PHP 实现(例如)来序列化和验证签名?
Facebook 在发送用户信息时就是这样做的。这将允许其他软件与 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。' );
}