Kimlik Doğrulama
Bir kullanıcı adına herhangi bir API isteği yapmadan önce, ilk olarak bir Müşteri Token'ı oluşturmanız gerekir. Bu token, sonraki tüm API çağrılarında kullanacağınız token'dır.
Müşteri Token'ı Oluşturma
Kullanıcılarınız adına Loyetta ile etkileşim kurmak için, backend'inizin önce authenticate endpoint'ini çağırması gerekir. Bu endpoint:
- Müşteri Loyetta'da yoksa müşteriyi oluşturur
- Gelecekteki tüm API isteklerinde kullanacağınız bir Müşteri Token'ı döndürür
/api/v1/superuser/authenticateSüper Kullanıcı Token'ı yalnızca müşteri girişi (auth) veya ürün kullanım kaydı oluşturma gibi yönetimsel işlemlerde gereklidir. Diğer tüm standart API istekleri için Müşteri Token'ı kullanılmalıdır.
İstek
Başlıklar (Headers)
| Başlık | Değer |
|---|---|
Authorization | Bearer {super-kullanici-tokeniniz} |
Content-Type | application/json |
Accept | application/json |
Gövde Parametreleri (Body)
| Parametre | Tür | Zorunlu | Açıklama |
|---|---|---|---|
customer_id | string | Evet | Bu müşteri için sizin benzersiz tanımlayıcınız (maks. 191 karakter) |
device_handle | string | Evet | Benzersiz cihaz tanımlayıcısı (maks. 191 karakter). Detaylar için aşağıya bakın. |
platform | string | Hayır | android, ios veya web |
os | string | Hayır | İşletim sistemi adı (örn. "iOS", "Android") |
os_version | string | Hayır | İşletim sistemi versiyonu (örn. "17.0", "14") |
brand | string | Hayır | Cihaz üreticisi (örn. "Apple", "Samsung") |
model | string | Hayır | Cihaz modeli (örn. "iPhone 15", "Galaxy S24") |
fcm_token | string | Hayır | Push bildirimleri için Firebase Cloud Messaging token'ı |
device_handle Hakkında
device_handle parametresi kullanıcı cihazlarını ve oturumlarını takip etmek için kullanılır. Bu parametre şu özellikleri mümkün kılar:
- Çoklu cihaz oturum yönetimi
- Cihaza özel push bildirimleri
- Cihaz kullanım desenleri analitiği
- Şüpheli giriş desenleri için güvenlik izleme
Şiddetle Önerilir: Kalıcı bir cihaz tanımlayıcısı oluşturun ve kullanıcının cihazında saklayın. O cihazdan yapılan her girişte aynı device_handle değerini gönderin.
Önerilen Yaklaşım
Uygulamanız ilk kurulduğunda bir UUID oluşturun ve yerel olarak kalıcı hale getirin:
// İlk uygulama açılışında, bir cihaz ID'si oluşturun ve saklayın
const deviceId = localStorage.getItem('device_id') || crypto.randomUUID();
localStorage.setItem('device_id', deviceId);
// Bu cihazdan yapılan tüm authenticate isteklerinde aynı ID'yi kullanın
const response = await fetch('/api/v1/superuser/authenticate', {
body: JSON.stringify({
customer_id: 'kullanici_12345',
device_handle: deviceId,
// ...
})
});Alternatif Yaklaşım
Sisteminiz cihaz tanımlayıcılarını kalıcı olarak saklayamıyorsa, her giriş isteğinde rastgele bir UUID oluşturabilirsiniz. Ancak bu yaklaşım:
- Çoklu cihaz takip özelliklerini kaybettirir
- Her girişte yeni bir "cihaz" kaydı oluşturur
- Üretim kullanımı için önerilmez
// Alternatif: her seferinde rastgele UUID (önerilmez)
const response = await fetch('/api/v1/superuser/authenticate', {
body: JSON.stringify({
customer_id: 'kullanici_12345',
device_handle: crypto.randomUUID(), // Her seferinde yeni ID
// ...
})
});Örnek İstek
curl -X POST https://{subdomain'iniz}.prod.loyetta.com/api/v1/superuser/authenticate \
-H "Authorization: Bearer {super-kullanici-tokeniniz}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"customer_id": "kullanici_12345",
"device_handle": "550e8400-e29b-41d4-a716-446655440000",
"platform": "ios",
"os": "iOS",
"os_version": "17.0",
"brand": "Apple",
"model": "iPhone 15"
}'Yanıt
Başarılı (200)
{
"success": true,
"token": "1|abc123def456...",
"user": {
"id": 42,
"customer_id": "kullanici_12345",
"points": 0,
"created_at": "2024-01-15T10:30:00.000000Z"
}
}Yanıt Alanları
| Alan | Açıklama |
|---|---|
success | İşlemin başarılı olduğunu belirten boolean değer |
token | Müşteri Token'ı - Sonraki tüm API isteklerinde bunu kullanın |
user.id | Loyetta'nın dahili kullanıcı ID'si |
user.customer_id | Sizin müşteri tanımlayıcınız (gönderdiğiniz değerin aynısı) |
user.points | Mevcut puan bakiyesi |
user.created_at | Kullanıcının Loyetta'da ilk oluşturulduğu zaman |
Önemli: user.id Loyetta'nın dahili tanımlayıcısıdır. Loyetta kullanıcılarını kendi veritabanı kayıtlarınızla eşleştirmek için user.customer_id kullanın.
Müşteri Token'ını Kullanma
Müşteri Token'ı oluşturduktan sonra, sonraki tüm API isteklerinde Authorization başlığında kullanın:
curl https://{subdomain'iniz}.prod.loyetta.com/api/v1/user/profile \
-H "Authorization: Bearer {musteri-tokeni}" \
-H "Accept: application/json"Müşteri Token'ı şunlara erişim sağlar:
- Kullanıcı profili ve puanlar
- Ödüller ve mağaza
- Oyunlar ve kampanyalar
- Tüm kullanıcıya özel işlemler
Hata Yanıtları
Yasak (403)
Token'ınız süper kullanıcı ayrıcalıklarına sahip değil:
{
"message": "Operation not allowed."
}Doğrulama Hatası (422)
Zorunlu alanlar eksik veya geçersiz:
{
"message": "The customer_id field is required.",
"errors": {
"customer_id": ["The customer_id field is required."]
}
}Yetkisiz (401)
Authorization başlığı eksik veya token geçersiz:
{
"message": "Unauthenticated."
}Tam Entegrasyon Örneği
class LoyettaClient {
constructor(superUserToken, baseUrl) {
this.superUserToken = superUserToken;
this.baseUrl = baseUrl;
}
// Kullanıcınız giriş yaptığında bunu çağırın
async authenticateCustomer(customerId, deviceHandle, deviceInfo = {}) {
const response = await fetch(
`${this.baseUrl}/api/v1/superuser/authenticate`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${this.superUserToken}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
customer_id: customerId,
device_handle: deviceHandle,
...deviceInfo, // platform, os, os_version, brand, model, fcm_token
}),
}
);
const data = await response.json();
if (!data.success) {
throw new Error(data.message);
}
// Sonraki istekler için müşteri token'ını döndür
return data.token;
}
// Diğer tüm API çağrıları için müşteri token'ını kullanın
async getUserProfile(customerToken) {
const response = await fetch(
`${this.baseUrl}/api/v1/user/profile`,
{
headers: {
'Authorization': `Bearer ${customerToken}`,
'Accept': 'application/json',
},
}
);
return response.json();
}
}