---
title: "Adım Adım Kimlik Doğrulamalı API: CodeIgniter 4 ile Uçtan Uca"
url: "https://cilginyazilim.com/blog/adim-adim-kimlik-dogrulamali-api-codeigniter"
description: "CodeIgniter 4 ile token tabanlı kimlik doğrulama: rota tanımı, filtre, token üretimi ve doğrulama, hata yanıtları ve güvenlik kontrol listesi."
published: "2026-08-25T10:00:00+03:00"
modified: "2026-08-25T10:00:03+03:00"
author: "superadmin"
category: "Kariyer ve Öğrenme"
tags: ["php", "codeigniter", "jwt", "güvenlik", "eğitim", "backend", "rest api", "token", "kimlik doğrulamalı api", "filtre", "rota", "uygulamalı ders", "web servisi"]
site: "CılgınYazılım"
language: "tr"
---

# Adım Adım Kimlik Doğrulamalı API: CodeIgniter 4 ile Uçtan Uca

Token üret, doğrula, koru: küçük ama gerçek bir API ucunu baştan sona kurmanın pratik anlatımı.

Bir **kimlik doğrulamalı api** kurmak, çoğu projede ilk gerçek arka uç işidir ve tam da bu yüzden en sık aynı hatalarla yapılır. Bu yazıda küçük ama eksiksiz bir örnek üzerinden ilerliyoruz: kullanıcı kimlik bilgisiyle token alır, sonraki isteklerde bu token'ı gönderir, korumalı uçlar filtre katmanında doğrulanır. Kod parçaları CodeIgniter 4 içindir; mantık ise çerçeveden bağımsızdır.

![Kimlik doğrulamalı API bileşenleri](https://cilginyazilim.com/uploads/blog/2026/08/adim-adim-kimlik-dogrulamali-api-codeigniter-ozet.png)
*Doğrulama controller içinde değil filtrede yapılır; unutulan tek uç açık kalır.*

## 1. Rotaları ayırın

İlk karar, hangi uçların açık hangilerinin korumalı olduğudur. Bunu her controller içinde tek tek kontrol etmek yerine rota grubunda tanımlamak, en yüksek getirili güvenlik kararıdır: yeni bir uç eklendiğinde varsayılan olarak korumalı olur.

```
$routes->group('api/v1', static function ($routes) {
    // Açık uçlar
    $routes->post('giris', 'Api\AuthController::login');

    // Korumalı uçlar — filtre grubun tamamına uygulanır
    $routes->group('', ['filter' => 'apiauth'], static function ($routes) {
        $routes->get('profil',        'Api\UserController::profile');
        $routes->get('siparisler',    'Api\OrderController::index');
    });
});
```

Tersini yapmak — yani varsayılanı açık bırakıp korumayı tek tek eklemek — er ya da geç unutulan bir uç üretir ve bu, en yaygın gerçek açıklardandır.

## 2. Giriş ucu: token üretimi

Giriş ucu üç iş yapar: kimlik bilgisini doğrular, token üretir ve token'ı sınırlı ömürle döndürür. Parola karşılaştırması mutlaka hash doğrulaması ile yapılmalıdır — bu konuya [parola saklama](https://cilginyazilim.com/blog/parola-saklama-ve-oturum-guvenligi) yazımızda ayrıntılı değiniyoruz.

```
public function login()
{
    $data = $this->request->getJSON(true) ?? [];
    $user = (new UserModel())->where('email', $data['email'] ?? '')->first();

    // Kullanıcı yoksa da aynı mesajı dön: hangi e-postanın kayıtlı
    // olduğunu sızdırmayın.
    if (! $user || ! password_verify($data['parola'] ?? '', $user['password'])) {
        return $this->response->setStatusCode(401)
            ->setJSON(['success' => false, 'message' => 'Kimlik bilgileri hatalı.']);
    }

    $token = bin2hex(random_bytes(32));

    (new ApiTokenModel())->insert([
        'user_id'    => $user['id'],
        // Token'ın kendisi değil, özeti saklanır: veritabanı sızarsa
        // token'lar doğrudan kullanılamaz.
        'token_hash' => hash('sha256', $token),
        'expires_at' => date('Y-m-d H:i:s', strtotime('+2 hours')),
    ]);

    return $this->response->setJSON([
        'success' => true,
        'token'   => $token,
        'expires' => 7200,
    ]);
}
```

İki ayrıntı kritiktir: token kriptografik olarak rastgele üretilir (`rand()` veya zaman damgası kullanılmaz) ve veritabanında ham hâliyle değil özetiyle saklanır.

## 3. Filtre: her istekte doğrulama

Doğrulama controller'da değil filtrede yapılmalıdır. Böylece kural tek yerde durur ve yeni uçlar otomatik olarak kapsanır.

```
class ApiAuthFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $header = $request->getHeaderLine('Authorization');
        if (! preg_match('/^Bearer\s+(\S+)$/', $header, $m)) {
            return $this->hata(401, 'Token gerekli.');
        }

        $kayit = (new ApiTokenModel())
            ->where('token_hash', hash('sha256', $m[1]))
            ->where('expires_at >', date('Y-m-d H:i:s'))
            ->first();

        if (! $kayit) {
            return $this->hata(401, 'Token geçersiz veya süresi dolmuş.');
        }

        // Doğrulanan kullanıcıyı istek boyunca taşı
        service('request')->kullaniciId = (int) $kayit['user_id'];
    }
}
```

Filtreyi `Config\Filters` içinde bir takma adla kaydetmeyi unutmayın; aksi halde rota tanımındaki `apiauth` adı çözülmez.

## 4. 401 ile 403 ayrımı

Bu iki kod sık karıştırılır ve karıştırıldığında istemci tarafında yanlış davranış üretir. **401**: kim olduğunuzu bilmiyorum (token yok, geçersiz veya süresi dolmuş) — istemci yeniden giriş yapmalıdır. **403**: kim olduğunuzu biliyorum ama bu işlem için yetkiniz yok — yeniden giriş çözüm değildir.

Yanıt gövdesi de tutarlı olmalıdır. Tüm uçların aynı zarf yapısını (`success`, `message`, `data`) kullanması, istemci tarafındaki hata yönetimini belirgin biçimde sadeleştirir — [REST API tasarımı](https://cilginyazilim.com/blog/rest-api-tasarimi-iyi-bir-api-nasil-olur) yazımız bu sözleşmeyi ele alıyor.

## 5. Güvenlik kontrol listesi

- **Yalnızca HTTPS.** Token düz metin bağlantıda gönderiliyorsa, geri kalan her önlem anlamsızdır.
- **Giriş ucuna hız sınırı.** Deneme sayısı sınırlanmazsa parola tahmini kolaylaşır; katmanlı savunma için [ilgili yazımıza](https://cilginyazilim.com/blog/kaba-kuvvet-saldirilarina-katmanli-savunma) bakın.
- **Kısa ömür + yenileme.** Uzun ömürlü token, çalındığında uzun süre geçerli kalır.
- **Çıkışta gerçek iptal.** Token kaydı silinmeli veya iptal işaretlenmelidir.
- **Token'ı loglamayın.** Hata ayıklama günlüğüne düşen bir token, kimlik bilgisidir; bkz. [üretimde log](https://cilginyazilim.com/blog/uretimde-log-a-ne-yazmali-ne-yazmamali).
- **Süresi dolmuş kayıtları temizleyin.** Zamanlanmış bir komut, tablonun sınırsız büyümesini engeller.

## 6. Test etmek

Bu akışın en az üç testi olmalıdır: token'sız istek 401 dönüyor mu, geçerli token ile doğru veri geliyor mu ve süresi dolmuş token reddediliyor mu? Üçüncüsü en sık atlanan ve en sık bozulan senaryodur. Test katmanlarının seçimi için [hangi testi ne zaman yazmalı](https://cilginyazilim.com/blog/yazilim-testi-nedir-hangi-testi-ne-zaman-yazmali) yazımıza, çerçevenin filtre ve rota ayrıntıları için [CodeIgniter 4 kullanıcı kılavuzuna](https://codeigniter.com/user_guide/) bakabilirsiniz.

## Sonuç

Kimlik doğrulamalı bir API kurmanın özü beş parçadadır: korumayı rota grubunda varsayılan hâle getirmek, token'ı kriptografik olarak üretip veritabanında özetiyle saklamak, doğrulamayı filtre katmanında tek yerde yapmak, 401 ile 403 ayrımını doğru kurmak ve süre/iptal yönetimini baştan planlamak. Bu adımlar tamamlandığında geri kalan uçları eklemek rutin bir işe dönüşür. Şimdi kendi projenizde tek bir kontrol yapın: korumasız kalan bir uç var mı? Rota dosyanızı açıp filtre dışında kalan satırları listelemek, bu sorunun en hızlı cevabıdır.

## Sıkça Sorulan Sorular

### Token’ı veritabanında saklamak yerine JWT kullansam olmaz mı?

Olur ve ölçekte avantaj sağlar; ancak imzalı token süresi dolana kadar iptal edilemez. Çıkış ve hesap askıya alma gerekiyorsa ya kısa ömür ya da sunucu tarafında tutulan bir yenileme katmanı gerekir.

### Token’ı neden hash’leyerek saklıyoruz?

Veritabanı sızdığında ham token’lar doğrudan kullanılabilir kimlik bilgisidir. Özet saklandığında saldırgan elindeki veriyle oturum açamaz; aynı mantık parola saklamadaki yaklaşımın tekrarıdır.

### Token’ı istemcide nerede saklamalıyım?

Tarayıcı uygulamalarında en güvenli seçenek HttpOnly çerezdir; JavaScript’ten okunabilen depolama alanları XSS durumunda token’ı doğrudan ele verir. Mobil uygulamalarda platformun güvenli anahtar deposu kullanılmalıdır.

### Süresi dolan token’lar tabloyu şişirir mi?

Şişirir. Zamanlanmış bir temizlik komutu ile süresi geçmiş kayıtlar düzenli olarak silinmelidir; aksi halde tablo zamanla en büyük tablolardan biri hâline gelir.

---

Kaynak: [Adım Adım Kimlik Doğrulamalı API: CodeIgniter 4 ile Uçtan Uca](https://cilginyazilim.com/blog/adim-adim-kimlik-dogrulamali-api-codeigniter)
