Kimlik Doğrulama
Bearer JWT
Section titled “Bearer JWT”Girişli uçlar Authorization: Bearer <access_token> başlığı bekler. Access token’lar kısa
ömürlüdür (15 dakika, ACCESS_OMUR_SANIYE = 15 * 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.1Host: api.kazarehberi.com.trAuthorization: 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ı
Section titled “Access / refresh ayrımı”- Access token: kısa ömürlü (15 dk), her istekte gönderilir.
- Refresh token: uzun ömürlü, yalnızca yeni access token almak için
/v1/auth/*altındaki yenileme ucuna gönderilir. İstemciler access token süresi dolduğunda refresh akışını tetikler.
Public VEYA girişli uçlar
Section titled “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
Section titled “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-gonder HTTP/1.1Host: api.kazarehberi.com.trContent-Type: application/jsonX-App-Key: <mobil-app-anahtari>
{ "telefon": "05xx..." }