# Swipenor: skoru istemci hesaplarsa sunucu neye güvenir?

> Kaydırmalı doğru/yanlış bilgi yarışması; asıl mesele oyun değil, istemcinin ürettiği skoru imzayla doğrulanabilir kılmak.

- Şu an ne yapıyor: Kaydırmalı doğru/yanlış bilgi yarışması bir mobil uygulama olarak çekirdek döngüsüyle uçtan uca çalışıyor; skoru istemci üretse de server_nonce ve HMAC imzasıyla sunucu tarafında doğrulanıyor. swipenor.com uygulamanın tanıtım sayfasıdır, oyunun kendisi değil.
- Tür: Mobil uygulama
- Olgunluk: Beta
- Durum: Geliştiriliyor
- Odak: Güvenlik & doğrulanabilirlik
- Başlangıç: 2026-07-18
- Teknolojiler: Laravel, PHP, PostgreSQL, Redis, React Native, Expo, TypeScript, Filament, Astro
- Etiketler: #mobil, #oyun, #api
- Web sitesi: https://swipenor.com
- Kaynak: https://www.muhammetsafak.com.tr/labs/swipenor/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
Mekanik basit: kart gelir, sağa kaydırırsan "Doğru", sola kaydırırsan "Yanlış".
Yaş grubuna göre içerik (4–9, 10–17, 18+), doğru cevapta puan, seri tutturunca
bonus, global ve yaş bazlı sıralama. Basit olmayan kısım, skorun kime ait
olduğu.

## Skoru istemci hesaplıyorsa sunucu neye bakar

Oyun döngüsü 60 fps'te istemcide dönüyor (reanimated worklet'leri +
gesture-handler); skoru da doğal olarak istemci hesaplıyor. Sunucunun bu sayıya
körlemesine inanması ise sıralama tablosunu ilk gün çöpe çevirir.

Denenen model **signed-client**: oturum başında sunucu bir `server_nonce`
üretiyor, istemci skoru bu nonce ile HMAC'leyip imzalıyor, API hem makuliyet
kontrolü yapıyor hem imzayı doğruluyor. Puan sabitleri de istemciye gömülü
değil — doğru cevap 100 puan, seri eşiği 3, seri bonusu +25 — hepsi `GET
/config` ile sunucudan geliyor ki istemci ile sunucu birbirinden sapmasın.

Puan sabitlerinin sunucudan gelmesi de imzanın devamı. İstemcide sabit
tutulsalardı imza yine doğrulanırdı ama doğrulanan sayı yanlış olabilirdi: eski sürümde
kalmış bir istemci, seri bonusunu kendi bildiği değerle hesaplayıp geçerli bir
imzayla gönderirdi. Sabitler tek yerde durunca doğrulama da anlamlı oluyor.

## Dört depo, tek şema sahibi

Dört ayrı depo tek klasörde: `game` (Expo SDK 57, React Native, TypeScript),
`api` (Laravel 13, PostgreSQL 16, Redis), `admin` (Filament, API ile
**paylaşılan** veritabanı üzerinde çalışır) ve Astro ile yazılmış tanıtım sayfası. Çekirdek döngü uçtan uca
çalışıyor: kaydırma, puanlama, seri bonusu, global/yaş sıralaması.

Şema sahipliği tek noktada tutuluyor. Admin paneli Filament ile yazıldı ve
API ile aynı veritabanına bakıyor, ama migration çalıştırmıyor: şemayı yalnız
API değiştiriyor. İki uygulamanın da migrate edebildiği bir kurulumda hangi
sürümün hangi tabloyu tanımladığı ilk çakışmada belirsizleşir ve o belirsizlik
üretimde geri alınamaz. Panelin şemaya yazma yetkisi bu yüzden hiç açılmadı.

## İmza modelinin sınavı yayında

Açık uçlar oyunun kendisinde değil, etrafında: reklam entegrasyonu ve tek
seferlik "reklamları kaldır" satın alması, mağaza materyalleri ve yayın süreci.
İmza modelinin gerçek kullanıcıya karşı ne kadar dayandığını da ancak yayında
göreceğim.
