Ana içeriğe geç

Kimlik Doğrulama ve İmza

Her istek iki başlıkla kimlik doğrular:

X-Api-Key: key_...
X-Signature: <ham gövdenin HMAC-SHA256 imzası, küçük harf hex>
Content-Type: application/json
BaşlıkDeğer
X-Api-KeyÇalışma alanının API anahtarı.
X-SignatureGövdenin ham metninin, gizli anahtarla alınan HMAC-SHA256 özeti; küçük harfli hex.
Content-Typeapplication/json

SDK'lar ayrıca Accept: application/json gönderir.

İmza​

X-Signature = lowercase_hex( HMAC_SHA256( key = gizli_anahtar, message = ham_gövde ) )
  • İmza gövdenin tamamını, byte byte kapsar. Alan listesi ya da sıralama kuralı yoktur.
  • Gövdeyi bir kez metne çevirin; aynı metni hem imzalayın hem gönderin. İmzadan sonra gövdeyi yeniden kodlayan bir katman (boşluk, alan sırası, Unicode ya da / kaçışı) imzayı bozar.
  • Gateway'in yanıtları ve abonelik webhook'ları aynı yöntemle, aynı gizli anahtarla imzalanır ve imza X-Signature başlığında gelir.

Test vektörü:

Gizli anahtarGövdeİmza
secret_test{"a":1}6d0c951564cdd2b6b70e75b214293a8cd2542815ba54fe91c7f6ce105bc3d592

İsteği imzalamak​

SDK'lar bu adımı kendileri yapar. SDK kullanmadan:

$body = json_encode($payload, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE);
$signature = hash_hmac('sha256', $body, getenv('ODEMEHUB_API_SECRET'));

// $body'yi olduğu gibi gönderin.

Yanıtın imzasını doğrulamak​

200 yanıtları imzalıdır. Gövdeyi ham hâliyle okuyun, aynı yöntemle imzasını hesaplayın ve X-Signature başlığıyla sabit zamanlı karşılaştırın. Tutmuyorsa yanıtı işlemeyin.

not

Gateway yanıt gövdesinde / karakterini \/ olarak kaçışlar (ör. "https:\/\/..."). İmza bu ham metin üzerinden hesaplanır; gövdeyi ayrıştırıp yeniden yazmadan doğrulayın.

use Gurmehub\Odemehub\Signature;

// SDK her 200 yanıtını kendisi doğrular; tutmazsa SignatureException atar.
$valid = (new Signature(getenv('ODEMEHUB_API_SECRET')))->verify($rawBody, $signatureHeader);

Kimlik doğrulama hataları​

Her iki durumda da yanıt 401'dir ve imzasızdır.

Durumresult.message
X-Api-Key eksik ya da adresteki çalışma alanına ait değilGeçersiz API anahtarı.
X-Signature eksik ya da gövdeyle tutmuyorİmza doğrulanamadı.
{
"result": {
"successful": false,
"message": "İmza doğrulanamadı."
}
}