SHA1 Kimlik Doğrulama

iyzico hizmetleri için kimlik doğrulama, Temel Kimlik Doğrulama ilkeleriyle uyumludur. PKI string, Base64 ve SHA-1 hashing dahil olmak üzere hassas bir dizi şifreleme tekniği aracılığıyla iyzico hizmetlerinin güvenliği artırır.

"Authorization": "IYZWS"+" "+"YOUR_API_KEY"+":"+"pkiString"

API'mize güvenli bir şekilde erişmek için kimlik doğrulama gereklidir. Kimlik doğrulama, HTTP isteklerinizin başlığına bir API Key ve pkiString'in birlikte eklenmesiyle gerçekleştirilir.

"Authorization": "IYZWS"+" "+"YOUR_API_KEY"+":"+"pkiString"

Örnek İstek Başlığı:

POST /payment/iyzipos/checkoutform/initialize/auth/ecom HTTP/1.1
Host: sandbox-api.iyzipay.com
Authorization: IYZWS sandbox-Uc8cxE7Y2c1kXdJ7JyiSgkyCSW8m8pth:mo75MZlJ73ycrsRzuIK2WVrPb9c=
Content-Type: application/json

Genel Özet

Kimlik doğrulamada kullanılan gerekli değişkenler aşağıda verilmiştir:

  • apiKey: Hesabınıza atanan ve hesabınıza özgü bir değere sahip API-Key.

  • x-iyzi-rnd: Her API çağrısı için istek başlığında yer alan rastgele oluşturulmuş bir sayı.

  • secretKey: Hesabınıza atanan ve hesabınıza özgü bir değere sahip secretKey.

  • requestString: İstek verisi parametrelerinin serileştirilmiş versiyonu.

Kimlik doğrulama üç ardışık adıma ayrılabilir:

  1. requestString

  2. SHA1 ve base64

  3. Kimlik Doğrulama

1. requestString

requestString, birleşik ayrıştırma işlemlerinden geçmiş olan istek yükünün ayrıştırılmış bir versiyonunu temsil eder. Bu işlemler, tüm boş boşlukların temizlenmesini, iki nokta üst üste işaretlerinin (:) eşitlere (=) dönüştürülmesini ve çift tırnak işaretlerinin ("") kaldırılmasını içerir.

iyzico API hizmetleri, ondalık sayılar için nokta (.) kullanılmasını gerektirir.

BIN Sorgulama servisine ait örnek bir curl;

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

Verilmiş olan BIN Sorgulama isteğine ait requestString aşağıdaki gibidir;

[locale=tr,binNumber=535805]

2. SHA1 ve base64

requestString'in doğru şekilde oluşturulduğunu varsayarsak artık SHA1 ve Base64 şifrelemelerinin zamanı geldi. pkiString işlemi, SHA1 şifrelemesini kullanarak bir karma oluşturmayı ve ardından bunu Base64 ile şifrelemeyi gerektirir.

Kimlik Doğrulama servislerinde kullanılacak olan imza aşağıdaki formül kullanılarak oluşturulur;

base64(SHA1(apiKey + request.headers["x-iyzi-rnd"] + secretKey + requestString))

Sonuç, istek başlığında kullanılacak pkiString'imizdir.

3. Yetkilendirme

Tüm işlemlerden sonra son ve en basit adım, istek başlığına IYZWS, YOUR_API_KEY ve pkiString'i eklemektir.

...
"Authorization": "IYZWS"+" "+"YOUR_API_KEY"+":"+"pkiString"
...

IYZWS ile YOUR_API_KEY arasında tek satır boşluk bulunmaktadır.

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

Postman'de gerçekleştirilen örnek olarak Bin Sorgulama talebini ele alırsak yetkilendirme süreci şu şekilde olacaktır;

var apiKey = pm.variables.get("apiKey")
var secretKey = pm.variables.get("secretKey")

var binNumber = {
    locale:null,
    conversationId:null,
    binNumber:null,
};

function nullClear(obj){
    for (var member in obj) {
        
        if(obj[member] === null) {    
            delete obj[member];
        }
        else if (typeof obj[member] === 'object'){
            obj[member]=nullClear(obj[member]);
            if(Object.keys(obj[member]).length===0){
                delete obj[member];
            }
        }
    }
    
    return obj;
}

//Set json string to model
function jsonToObj(jsonString, obj) {
    var parsedJsonString = JSON.parse(jsonString)
    for(var key in parsedJsonString) {
        if(parsedJsonString.hasOwnProperty(key)) {
            if (typeof parsedJsonString[key] === 'object') {
                if(Array.isArray(parsedJsonString[key])){
                    for(var i = 0; i < parsedJsonString[key].length; i++){
                        if(key =="basketItems"){
                            obj[key].push(new BasketItem());
                            obj[key][i]=jsonToObj(JSON.stringify(parsedJsonString[key][i]), obj[key][i])
                        }else {
                            obj[key][i] = parsedJsonString[key][i];
                        }
                    }
                }else{
               obj[key] = jsonToObj(JSON.stringify(parsedJsonString[key]), obj[key])
                }
            }else{
                obj[key] = parsedJsonString[key];
            }
            
        }
    }
    obj = nullClear(obj);
    
    return obj;
}

//generate pki string of object
function generateRequestString(obj) {
    var isArray = Array.isArray(obj);
    
    var requestString = '[';
    for (var i in obj) {
        var val = obj[i];
        if (!isArray) {
            requestString += i + '=';
        }
        if (typeof val === 'object') {
            requestString += generateRequestString(val);
        } else {
            requestString += val;
        }
        requestString += isArray ? ', ' : ',';
    }
    requestString = requestString.slice(0, (isArray ? -2 : -1));
    requestString += ']';
    return requestString;
    
}    

//generate authorization string
function generateAuthorizationString(obj) {
    var requestString = generateRequestString(obj);
    var hashSha1 =  CryptoJS.SHA1(apiKey+request.headers["x-iyzi-rnd"]+secretKey+requestString);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hashSha1);
    var authorization = "IYZWS"+" "+apiKey+":"+hashInBase64;
    console.log(requestString);
    postman.setGlobalVariable("pkiString", apiKey+request.headers["x-iyzi-rnd"]+secretKey+requestString);
    return authorization
}

var requestModel = binNumber;
requestModel = jsonToObj(request.data, requestModel);
var authorization = generateAuthorizationString(requestModel)
postman.setGlobalVariable("authorization", authorization);

Last updated