Ana içeriğe geç

POST /api/license/validate

Token'ı doğrular, kontör düşürür ve imza yetkisi verir. Tek kullanımlık.

Request

Method: POST

URL: https://api.signaport.com/api/license/validate

Headers:

Content-Type: application/json

Body:

{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"origin": "https://online.akareisg.com"
}

Parametreler

AlanTipZorunluAçıklama
tokenstringEvetget-token'dan alınan signToken
originstringHayırİstek yapan domain (CORS kontrolü)

Response

Başarılı (200 OK)

{
"success": true,
"message": "Quota güncellendi",
"usedQuota": 25,
"remainingQuota": 975
}

Response Alanları:

AlanTipAçıklama
successbooleanİşlem durumu
messagestringİşlem mesajı
usedQuotaintegerKullanılan toplam kontör
remainingQuotaintegerKalan kontör

Hata Yanıtları

400 Bad Request - Token Boş

{
"success": false,
"message": "Token boş olamaz"
}

401 Unauthorized - Token Süresi Dolmuş

{
"success": false,
"message": "Token süresi dolmuş"
}

401 Unauthorized - Geçersiz Token

{
"success": false,
"message": "Geçersiz token"
}

400 Bad Request - Token Kullanılmış

{
"success": false,
"message": "Bu token zaten kullanılmış. Yeni token alınız."
}

401 Unauthorized - Domain Yetkisi Yok

{
"success": false,
"message": "Bu domain için yetki yok"
}

400 Bad Request - Kontör Doldu

{
"success": false,
"message": "İmza kotası doldu",
"remainingQuota": 0
}

Örnekler

cURL

curl -X POST https://api.signaport.com/api/license/validate \
-H "Content-Type: application/json" \
-d '{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"origin": "https://online.akareisg.com"
}'

JavaScript (Fetch)

const response = await fetch('https://api.signaport.com/api/license/validate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
token: signToken,
origin: 'https://online.akareisg.com'
})
});

const data = await response.json();

if (data.success) {
console.log('Kontör düşürüldü');
console.log('Kalan:', data.remainingQuota);
} else {
console.error('Hata:', data.message);
}

C#

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

public async Task<ValidateResponse> ValidateToken(string token, string origin)
{
var httpClient = new HttpClient();

var request = new
{
token = token,
origin = origin
};

var content = new StringContent(
JsonConvert.SerializeObject(request),
Encoding.UTF8,
"application/json"
);

var response = await httpClient.PostAsync(
"https://api.signaport.com/api/license/validate",
content
);

var responseData = await response.Content.ReadAsStringAsync();
var validateResponse = JsonConvert.DeserializeObject<ValidateResponse>(responseData);

if (validateResponse.Success)
{
Console.WriteLine($"Kontör düşürüldü. Kalan: {validateResponse.RemainingQuota}");
}
else
{
Console.WriteLine($"Hata: {validateResponse.Message}");
}

return validateResponse;
}

public class ValidateResponse
{
public bool Success { get; set; }
public string Message { get; set; }
public int UsedQuota { get; set; }
public int RemainingQuota { get; set; }
}

PHP

<?php

$data = [
'token' => $signToken,
'origin' => 'https://online.akareisg.com'
];

$ch = curl_init('https://api.signaport.com/api/license/validate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);

if ($result['success']) {
echo "Kontör düşürüldü. Kalan: " . $result['remainingQuota'] . "\n";
} else {
echo "Hata: " . $result['message'] . "\n";
}

?>

İş Akışı

Normal Akış

  1. Web uygulaması /api/v1/auth/get-token çağırır, signToken alır
  2. Web uygulaması, SignaPort'a token gönderir
  3. SignaPort, /api/license/validate endpoint'ini çağırır
  4. API token'ı doğrular:
    • JWT decode
    • Expire kontrolü
    • Database'de kullanılmış mı?
    • Domain yetkisi var mı?
    • Kontör var mı?
  5. Kontrol OK ise:
    • Token database'e kaydedilir (status='used')
    • Kontör düşer
    • Success response döner
  6. SignaPort XML'i imzalar

Hata Durumları

Token Süresi Dolmuş:

  • Yeni token al (get-token)
  • Tekrar validate çağır

Token Kullanılmış:

  • Her imza için yeni token gerekli
  • Yeni token al

Kontör Doldu:

  • Yeni paket satın alınmalı
  • İmzalama yapılamaz

Önemli Notlar

  • Bu endpoint her çağrıldığında kontör düşer
  • Token tek kullanımlık, aynı token 2. kez kullanılamaz
  • Token süresi 5 dakika
  • origin parametresi opsiyonel ama önerilir (güvenlik)
  • Database'de her token kaydı saklanır (audit trail)
  • SignaPort tarafından otomatik çağrılır, manuel çağrılmamalı

Rate Limiting

Bu endpoint için dakika başına maksimum 100 istek yapılabilir.

Limit aşıldığında HTTP 429 döner:

{
"success": false,
"message": "Çok fazla istek. Lütfen bekleyiniz.",
"retryAfter": 45
}

Güvenlik

  • HTTPS zorunlu
  • JWT signature doğrulanır
  • Token database'de kontrol edilir
  • Domain kontrolü yapılabilir (CORS)
  • Her token sadece bir kez kullanılabilir