Olá. Gostaria de usar os webhooks do Discourse quando um usuário é criado ou atualizado, mas preciso poder confiar nos dados enviados pelo Discourse. Seria possível implementar suporte a chaves pública-privada ou, pelo menos, uma chave secreta simétrica, que eu possa usar para verificar a carga assinada? Poderíamos adotar um framework padrão para assinar todas as cargas e uma implementação PHP padrão, por exemplo, para serializar e verificar a assinatura?
O Facebook faz isso ao enviar informações sobre um usuário. Isso permitiria que outros softwares se integrassem aos usuários e outros objetos do Discourse.
A chave secreta do Webhook se aproxima do que você está procurando? Veja como o plugin WP Discourse a verifica em relação à Chave Secreta do Webhook definida no WordPress:
public function verify_discourse_webhook_request( $data ) {
$options = $this->get_options();
// O X-Discourse-Event-Signature consiste em 'sha256=' . hash HMAC do payload bruto.
// É gerado calculando `hash_hmac( 'sha256', $payload, $secret )`.
$sig = substr( $data->get_header( 'X-Discourse-Event-Signature' ), 7 );
if ( $sig ) {
$payload = $data->get_body();
// Chave usada para verificar a solicitação - uma chave correspondente precisa ser definida no webhook do Discourse.
$secret = ! empty( $options['webhook-secret'] ) ? $options['webhook-secret'] : '';
if ( ! $secret ) {
return new \WP_Error( 'discourse_webhook_configuration_error', 'A chave secreta do webhook não foi definida.' );
}
if ( hash_hmac( 'sha256', $payload, $secret ) === $sig ) {
return $data;
} else {
return new \WP_Error( 'discourse_webhook_authentication_error', 'Erro na solicitação do Webhook do Discourse: as assinaturas não correspondem.' );
}
}
return new \WP_Error( 'discourse_webhook_authentication_error', 'Erro na solicitação do Webhook do Discourse: o X-Discourse-Event-Signature não foi definido para a solicitação.' );
}