Kimlik Doğrulama
Bearer JWT, public/girişli uç deseni ve mobil X-App-Key.
Bearer JWT
Girişli uçlar Authorization: Bearer <access_token> başlığı bekler. Access token'lar
24 saat ömürlüdür (ACCESS_OMUR_SANIYE = 24 * 60 * 60) ve sub (kullanıcı id), rol
(musteri | partner | admin), partner_tipi, admin_rolu claim'lerini taşır. İzin listesi
token'a konmaz — yetki matrisi backend kodunda (src/auth/izinler.ts) tutulur; token yalnızca
kimliği taşır.
GET /v1/hesaplamalar HTTP/1.1
Host: api.kazarehberi.com.tr
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Token doğrulama accessDogrula(token, secret) ile yapılır (HS256, jose kütüphanesi). Geçersiz
veya süresi dolmuş token → 401 TOKEN_GECERSIZ.
Access / refresh ayrımı
- Access token: 24 saat ömürlü, her istekte gönderilir. Stateless olduğundan her authed
istekte kullanıcının güncel durum/rolü DB'den de doğrulanır (silinen/pasife alınan hesap eski
token'la devam edemez →
403 OTURUM_PASIF). - Refresh token: 30 gün ömürlü (
REFRESH_OMUR_GUN = 30), rotation'lıdır; yalnızca yeni access token almak içinPOST /v1/auth/yenileucuna gönderilir. Reuse tespitinde token ailesinin tamamı iptal edilir.
Public VEYA girişli uçlar
Bazı uçlar (özellikle hesaplama uçları) hem girişsiz hem girişli çalışabilir: Bearer varsa
istek kullanıcıya bağlanır (örn. hesaplama geçmişine kaydedilir), yoksa anonim işlenir. Bu desen
kullaniciIdCoz fonksiyonuyla uygulanır:
/** Public uç — ama Bearer varsa hesaplama kullanıcıya bağlanır. */
async function kullaniciIdCoz(c): Promise<string | null> {
const baslik = c.req.header('Authorization');
if (!baslik?.startsWith('Bearer ')) return null;
const claims = await accessDogrula(baslik.slice(7), env.JWT_SECRET);
return claims?.sub ?? null;
}
Buna karşılık kesinlikle girişli olması gereken uçlar (örn. GET /v1/hesaplamalar — kullanıcının
kendi geçmişi) authMiddleware() çağırır ve Bearer/cookie yoksa 401 TOKEN_GECERSIZ döner.
Mobil: X-App-Key
Mobil uygulamada native bir Turnstile (captcha) SDK'sı olmadığından — WebView içinde captcha
kırılgan çalışır — OTP gönderme ucu mobil istemciler için alternatif bir doğrulama kabul eder:
istekte geçerli bir X-App-Key başlığı varsa (ve sunucudaki MOBIL_APP_KEY secret'ıyla eşleşiyorsa)
captcha adımı atlanır.
POST /v1/auth/otp-iste HTTP/1.1
Host: api.kazarehberi.com.tr
Content-Type: application/json
X-App-Key: <mobil-app-anahtari>
{ "telefon": "05xx..." }
