Kimlik Doğrulama

Tüm API istekleri HTTP Basic Authentication standardı üzerinden yetkilendirilmektedir.

Header Format'ı

Authorization: Basic BASE64(apiKey:apiSecret)

Yaygın HTTP istemcilerinde -u veya auth parametreleri kullanıldığında base64 dönüşümü otomatik olarak gerçekleştirilmektedir.

Anahtar ve Gizli Değerin Edinilmesi

API anahtarları doğrudan tüketici tarafından oluşturulamaz. Anahtar talebi, Milagron yönetim ekibine iletilir ve ekip tarafından üretilerek paylaşılır.

  1. Milagron yönetim ekibi ile iletişime geçilir ve API erişim talebi iletilir.
  2. Talep onaylandıktan sonra üretilen API Key ve API Secret değerleri paylaşılır.
  3. Üretilen secret değeri yalnızca bir defa paylaşılır; güvenli bir şekilde saklanması zorunludur.
Secret Değerinin Kaybedilmesi Secret değerinin kaybedilmesi durumunda yeniden üretim için Milagron yönetim ekibi ile iletişime geçilmelidir. Yeni bir secret üretildiğinde, önceki secret anında geçersiz hale gelir.

Kullanım Örnekleri

Aşağıda, farklı programlama dilleri ile kimlik doğrulamalı bir API çağrısı örneği yer almaktadır. API_KEY ve API_SECRET ifadeleri, kendi değerlerinizle değiştirilmelidir.

curl -u "API_KEY:API_SECRET" \
  -X POST https://api.milagron.com/integration/inventory/sellers/123/products/stock \
  -H "Content-Type: application/json" \
  -d '{"barcode":"ABC123"}'
<?php

$ch = curl_init('https://api.milagron.com/integration/inventory/sellers/123/products/stock');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD        => 'API_KEY:API_SECRET',
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode(['barcode' => 'ABC123']),
]);

$response = curl_exec($ch);
$status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$data = json_decode($response, true);
const auth = Buffer.from('API_KEY:API_SECRET').toString('base64');

const res = await fetch('https://api.milagron.com/integration/inventory/sellers/123/products/stock', {
    method: 'POST',
    headers: {
        'Authorization': `Basic ${auth}`,
        'Content-Type':  'application/json'
    },
    body: JSON.stringify({ barcode: 'ABC123' })
});

const data = await res.json();
import requests

response = requests.post(
    'https://api.milagron.com/integration/inventory/sellers/123/products/stock',
    auth=('API_KEY', 'API_SECRET'),
    json={'barcode': 'ABC123'}
)

response.raise_for_status()
data = response.json()
package main

import (
    "bytes"
    "encoding/json"
    "net/http"
)

func main() {
    payload, _ := json.Marshal(map[string]string{"barcode": "ABC123"})

    req, _ := http.NewRequest("POST",
        "https://api.milagron.com/integration/inventory/sellers/123/products/stock",
        bytes.NewBuffer(payload))

    req.SetBasicAuth("API_KEY", "API_SECRET")
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
}
import java.net.URI;
import java.net.http.*;
import java.util.Base64;

HttpClient client = HttpClient.newHttpClient();

String auth = Base64.getEncoder()
    .encodeToString("API_KEY:API_SECRET".getBytes());

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.milagron.com/integration/inventory/sellers/123/products/stock"))
    .header("Authorization", "Basic " + auth)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("{\"barcode\":\"ABC123\"}"))
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());
require 'net/http'
require 'uri'
require 'json'

uri = URI('https://api.milagron.com/integration/inventory/sellers/123/products/stock')

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.path)
request.basic_auth('API_KEY', 'API_SECRET')
request['Content-Type'] = 'application/json'
request.body = { barcode: 'ABC123' }.to_json

response = http.request(request)
data = JSON.parse(response.body)
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

var client = new HttpClient();

var auth = Convert.ToBase64String(
    Encoding.UTF8.GetBytes("API_KEY:API_SECRET"));
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", auth);

var content = new StringContent(
    "{\"barcode\":\"ABC123\"}",
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync(
    "https://api.milagron.com/integration/inventory/sellers/123/products/stock",
    content);

var data = await response.Content.ReadAsStringAsync();

Yetkiler (Scope'lar)

Her API anahtarı, yalnızca tanımlanmış yetkiler dahilinde işlem yapabilir. Gerekli yetki tanımlanmadan çağrılan endpoint'ler 403 Forbidden hatası ile yanıt verir.

ScopeErişim
stock:readStok bilgilerinin sorgulanması
stock:writeStok ve fiyat güncellemesi
product:readÜrün listesi ve katalog bilgilerinin (kategori, ürün tipi, özellik, marka) görüntülenmesi
product:writeÜrün oluşturma ve ürün bilgilerinin güncellenmesi
order:readSipariş listesinin görüntülenmesi
order:writeSipariş güncelleme işlemleri (kargoya teslim vb.)
price:readFiyat bilgilerinin görüntülenmesi
price:writeFiyat bilgilerinin güncellenmesi
shipment:readKargo bilgilerinin görüntülenmesi
shipment:writeKargo bilgilerinin güncellenmesi

Güvenlik Önerileri

Secret Değerinin Korunması
  • Secret değeri istemci tarafında (frontend, mobil uygulama) yer almamalıdır.
  • Sürüm kontrol sistemlerine (Git vb.) commit edilmemelidir.
  • Log kayıtlarında görünmediği düzenli olarak doğrulanmalıdır.
  • Sunucu tarafında, environment variable veya yapılandırma yönetim sistemleri içerisinde saklanmalıdır.

IP Whitelist

Her API anahtarı için isteğe bağlı olarak IP whitelist tanımlanabilir. Tanımlı olduğu durumlarda, yalnızca belirtilen IP adreslerinden gelen istekler kabul edilir. Listenin boş bırakılması, tüm IP adreslerinden erişime izin verildiği anlamına gelir.