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
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| token | string | Evet | get-token'dan alınan signToken |
| origin | string | Hayır | İstek yapan domain (CORS kontrolü) |
Response
Başarılı (200 OK)
{
"success": true,
"message": "Quota güncellendi",
"usedQuota": 25,
"remainingQuota": 975
}
Response Alanları:
| Alan | Tip | Açıklama |
|---|---|---|
| success | boolean | İşlem durumu |
| message | string | İşlem mesajı |
| usedQuota | integer | Kullanılan toplam kontör |
| remainingQuota | integer | Kalan 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ış
- Web uygulaması
/api/v1/auth/get-tokençağırır, signToken alır - Web uygulaması, SignaPort'a token gönderir
- SignaPort,
/api/license/validateendpoint'ini çağırır - API token'ı doğrular:
- JWT decode
- Expire kontrolü
- Database'de kullanılmış mı?
- Domain yetkisi var mı?
- Kontör var mı?
- Kontrol OK ise:
- Token database'e kaydedilir (status='used')
- Kontör düşer
- Success response döner
- 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