Module: Integrobr::NfseSdk::Webhooks

Defined in:
lib/integrobr/nfse_sdk/webhooks.rb

Class Method Summary collapse

Class Method Details

.comparar_tempo_constante(a, b) ⇒ Boolean

Returns:

  • (Boolean)


27
28
29
30
31
32
33
34
# File 'lib/integrobr/nfse_sdk/webhooks.rb', line 27

def comparar_tempo_constante(a, b)
  return false unless a.is_a?(String) && b.is_a?(String)
  return false unless a.bytesize == b.bytesize

  resultado = 0
  a.bytes.zip(b.bytes) { |x, y| resultado |= x ^ y }
  resultado.zero?
end

.verificar_assinatura(corpo_bruto, assinatura_recebida, segredo) ⇒ Boolean

Verifica a assinatura HMAC-SHA256 (cabeçalho X-IntegroBR-Signature) de uma entrega de webhook, comparando em tempo constante pra evitar ataques de timing.

Parameters:

  • corpo_bruto (String)

    corpo bruto exatamente como recebido — não o objeto já parseado, já que reserializar JSON pode mudar a ordem/espaçamento e invalidar a assinatura.

  • assinatura_recebida (String)

    valor do cabeçalho X-IntegroBR-Signature.

  • segredo (String)

    segredo do webhook, obtido na criação (ou rotação) dele pelo painel — só é exibido uma vez.

Returns:

  • (Boolean)


21
22
23
24
# File 'lib/integrobr/nfse_sdk/webhooks.rb', line 21

def verificar_assinatura(corpo_bruto, assinatura_recebida, segredo)
  esperada = OpenSSL::HMAC.hexdigest("SHA256", segredo, corpo_bruto)
  comparar_tempo_constante(esperada, assinatura_recebida)
end