HMACSHA256 Kimlik Doğrulama

iyzico hizmetlerindeki kimlik doğrulama, Base64 ve HmacSHA256 hashleme dahil olmak üzere hassas bir şifreleme teknikleri dizisi aracılığıyla güvenliği artırır.

API'ımıza güvenli bir şekilde erişmek için kimlik doğrulama gereklidir. Kimlik doğrulama, API Anahtarı ve base64EncodedAuthorization'ın HTTP isteklerinizin başlığına dahil edilmesiyle gerçekleştirilir.

"Authorization": "IYZWSv2"+" "+"base64EncodedAuthorization"

Örnek İstek Başlığı:

POST /payment/bin/check HTTP/1.1
Host: sandbox-api.iyzipay.com
Authorization: IYZWSv2 YXBpS2V5OnNhbmRib3gtbDlNZDFHajNJWWNtdTROZGFXeGFTVW9Db1g3REM1UkEmcmFuZG9tS2V5OjEyMzQ1Njc4OSZzaWduYXR1cmU6MDc5ZGY0YjI0MjZmYzdmNDIwOGQ4ZjIyZmJjMDM0OTc5NDAxOWY4Y2UyYjA3MTFkZTc4MDhiNDg3NGY0ZTc5Ng==
Content-Type: application/json
x-iyzi-rnd: 123456789

Genel Bakış

İşte gerekli bileşenlerin ayrıntılı bir açıklaması:

  • apiKey : Hesabınıza atanmış benzersiz API anahtarı

  • secretKey : Hesabınızla ilişkili gizli anahtarınız.

  • x-iyz-rnd: Her API çağrısı için istek başlığına eklenen, müşterilerimiz tarafından rastgele oluşturulmuş bir sayı.

  • encryptedData: istek verisi içerisinde yer alan parametrelerin HMACSHA256 ile şifrelenmiş versiyonu.

Kimlik doğrulama tek bir adımda basitçe yapılır. Ancak bir Yetkilendirme Dizisi oluşturmak için üç adım vardır.

  1. encryptedData

  2. base64Encoded

  3. Kimlik Doğrulama

1. encryptedData

encryptedData istek yükünün şifrelenmiş bir versiyonunu ifade eder. Sürecin sonunda HMACSHA256 şifrelemesini kullanarak bir hash oluşturulur.

Kimlik doğrulamada kullanılacak imza, nispeten aşağıdaki formül kullanılarak oluşturulur;

HMACSHA256(request.header.randomKey + request.payload, secretKey)

Aşağıdaki örnekte, Bin Sorgulama işlemine ait bir istek yapısı bulunmaktadır;

curl 
--location --request POST 'https://api.iyzipay.com/payment/bin/check' \
--header 'Authorization: IYZWSv2 ***' \
--header 'x-iyzi-rnd: 123456789' \
--header 'Content-Type: application/json' \
--data-raw '{
    "locale":"tr",
    "binNumber":"535805",
    "conversationId": "docsTest-v1"
}'

Yukarıdaki istek için encryptedData aşağıdaki gibidir;

079df4b2426fc7f4208d8f22fbc0349794019f8ce2b0711de7808b4874f4e796

2. base64Encoded

encryptedData 'nın doğru bir şekilde oluşturulduğunu varsayarsak, şimdi Base64 şifrelemesine geçebiliriz.

Kimlik doğrulamada kullanılacak imza, nispeten aşağıdaki formül kullanılarak oluşturulur;

base64("apiKey:"+apiKey+"&randomKey:"+randomKey+"&signature:"+encryptedData)

Sonuç olarak istek başlığında kullanılacak base64EncodedAuthorization değişkenini elde ederiz.

3. Authorization

Bütün bu işlemlerden sonra, son ve en kolay adım olarak istek başlığına IYZWSv2 base64EncodedAuthorization eklemeliyiz.

...
"Authorization": "IYZWSv2"+" "+"base64EncodedAuthorization"
...

IYZWSv2 ve base64EncodedAuthorization arasında bir adet boşluk bulunmaktadır.

Kimlik Doğrulama İçin Örnek Pre-Request Kodu

Örnek olarak test ortamında gerçekleşen Bin Sorgulama talebini ele alırsak yetkilendirme süreci şu şekilde olacaktır;

var apiKey = environment.apiKey;
var secretKey = environment.secretKey;

function getUriPath(request) {
    var splitUrl = request.url.split('?')[0].split('/');
    let uri = "";
    for (let i = 1; i < splitUrl.length; i++) {
        uri += "/" + splitUrl[i];
    }
    return uri;
}

//generate authorization string
function generateAuthorizationString() {
    var randomVar = "123456789";
    var randomKey = new Date().getTime() + randomVar;
    var uri_path = getUriPath(request);
    var payload = _.isEmpty(request.data) ? uri_path : uri_path + request.data;
    var dataToEncrypt = randomKey + payload;
    var encryptedData = CryptoJS.HmacSHA256(dataToEncrypt, secretKey);

    var authorizationString = "apiKey:" + apiKey
                        + "&randomKey:" + randomKey
                        + "&signature:" + encryptedData;
    var base64EncodedAuthorization = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(authorizationString));
    return "IYZWSv2 " + base64EncodedAuthorization;
}
var authorization = generateAuthorizationString();
postman.setEnvironmentVariable("authorization", authorization);

Last updated