Zapytania tworzone przez webhooki posiadają nagłówek x-infakt-signature. Aby zweryfikować jego autentyczność należy użyć sekretnego klucza do HMAC z ustawień webhooka.
Poniższe przykłady kodu to sugestie, minimum. Należy je przerobić pod własne rozwiązanie, według założonych konwencji i pamiętając o zabezpieczeniu danych. Przykładowo, zapisywanie klucza HMAC bezpośrednio w kodzie aplikacji nie jest wskazane.
JS (node):
const crypto = require('crypto'); function verifySignature(request) { const signature = request.headers['X-Infakt-Signature']; const payload = request.body; const secretKey = 'secret_key'; // Sekretny klucz do HMAC const expectedSignature = crypto .createHmac('sha256', secretKey) .update(payload) .digest('hex'); return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature)); }
Ruby on Rails:
def verify_signature(request) secret_key = "secret_key" # Sekretny klucz do HMAC payload = request.body.read received_signature = request.headers['X-Infakt-Signature'] computed_signature = OpenSSL::HMAC.hexdigest( OpenSSL::Digest.new('sha256'), secret_key, payload ) ActiveSupport::SecurityUtils.secure_compare(computed_signature, received_signature) end
C#:
using System; using System.IO; using System.Security.Cryptography; using System.Text; public class HmacVerifier { public static bool VerifySignature(HttpRequest request) { string secretKey = "secret_key"; // Sekretny klucz do HMAC using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { string payload = reader.ReadToEnd(); string receivedSignature = request.Headers["X-Infakt-Signature"]; using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey))) { var computedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload)); var computedSignature = BitConverter.ToString(computedHash).Replace("-", "").ToLower(); return computedSignature == receivedSignature.ToLower(); } } } }
Komentarze
Komentarze: 0
Zaloguj się, aby dodać komentarz.