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çin POST /v1/auth/yenile ucuna 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..." }
WhatsApp Destek