İçeriğe geç

Kimlik Doğrulama

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.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 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.

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 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.1
Host: api.kazarehberi.com.tr
Content-Type: application/json
X-App-Key: <mobil-app-anahtari>
{ "telefon": "05xx..." }