Laravel Sanctum vs Passport 2026: API Kimlik Doğrulama ve Mülakat Soruları

Laravel Sanctum ve Passport karşılaştırması. Pratik kod örnekleri, API güvenlik en iyi uygulamaları ve Laravel geliştiricileri için mülakat soruları.

Laravel Sanctum vs Passport 2026: API Kimlik Doğrulama ve Mülakat Soruları

Laravel Sanctum ve Passport farklı API kimlik doğrulama ihtiyaçlarına hizmet eder ve yanlış paketi seçmek gereksiz karmaşıklığa veya güvenlik açıklarına yol açar. Bu rehber, pratik kod örnekleri ve gerçek mülakat soruları ile her iki paketi detaylı olarak inceler.

Hızlı Karar

Sanctum, SPA kimlik doğrulaması ve basit API token'ları için uygundur. Passport, yetkilendirme kodları, istemci kimlik bilgileri ve yenileme token'ları ile tam OAuth2 uygular. Çoğu uygulama Sanctum'a ihtiyaç duyar.

Laravel Sanctum vs Passport: Temel Farklar

Sanctum, birinci taraf uygulamalar için tasarlanmış hafif token tabanlı kimlik doğrulama sağlar. Paket, SPA'lar için çerez tabanlı oturum kimlik doğrulaması ve mobil uygulamalar ile basit API'ler için kişisel erişim token'ları kullanır.

Passport, yetkilendirme sunucuları, istemci kimlik bilgileri verme ve makineden makineye kimlik doğrulama dahil olmak üzere tam OAuth2 spesifikasyonunu uygular. Bu karmaşıklık, üçüncü taraf erişimini yetkilendirmesi gereken uygulamalar için anlamlıdır.

| Özellik | Sanctum | Passport | |---------|---------|----------| | Birincil Kullanım Alanı | SPA, Mobil Uygulamalar, Basit API'ler | Üçüncü Taraf OAuth2, Makineden Makineye | | Token Türü | Basit hash'lenmiş token'lar | OAuth2 kapsamlı JWT | | Oturum Kimlik Doğrulaması | Evet (çerez tabanlı) | Hayır | | OAuth2 Grant'ları | Yok | Tam spesifikasyon | | Paket Boyutu | Minimal | Önemli | | Yapılandırma | Basit | Karmaşık |

SPA Kimlik Doğrulaması için Sanctum Uygulaması

Sanctum SPA kimlik doğrulaması, API token'ları yerine Laravel oturum çerezlerine dayanır. Frontend ve backend'in bunun çalışması için aynı üst düzey alan adını paylaşması gerekir.

config/sanctum.phpphp
return [
    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
    ))),

    'expiration' => null, // Token'lar varsayılan olarak süresi dolmaz

    'middleware' => [
        'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
        'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
    ],
];

SPA, kimlik doğrulamalı istekler yapmadan önce CSRF çerez endpoint'ini çağırmalıdır. Bu, oturumu başlatır ve XSRF-TOKEN çerezini ayarlar.

javascript
// Frontend: Giriş öncesi CSRF korumasını başlat
async function initializeAuth() {
    await fetch('/sanctum/csrf-cookie', {
        credentials: 'include'
    });
}

async function login(email, password) {
    await initializeAuth();
    
    const response = await fetch('/api/login', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-XSRF-TOKEN': getCookie('XSRF-TOKEN'),
            'Accept': 'application/json'
        },
        credentials: 'include',
        body: JSON.stringify({ email, password })
    });
    
    return response.json();
}

Sanctum API Token Kimlik Doğrulaması

Mobil uygulamalar ve üçüncü taraf entegrasyonları, oturum çerezleri yerine kişisel erişim token'larını kullanır. Sanctum bu token'ları veritabanında SHA-256 hash'leri olarak saklar.

app/Http/Controllers/AuthController.phpphp
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    public function createToken(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
            'device_name' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (! $user || ! Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['Sağlanan kimlik bilgileri yanlış.'],
            ]);
        }

        // Yeteneklerle (kapsamlarla) token
        $token = $user->createToken(
            $request->device_name,
            ['read', 'write'] // Opsiyonel yetenekler
        );

        return response()->json([
            'token' => $token->plainTextToken,
            'expires_at' => null // sanctum.php'de yapılandır
        ]);
    }

    public function revokeToken(Request $request)
    {
        // Mevcut token'ı iptal et
        $request->user()->currentAccessToken()->delete();

        return response()->json(['message' => 'Token iptal edildi']);
    }
}

Rotaları auth:sanctum middleware ile koruyun. tokenCan metodunu kullanarak token yeteneklerini kontrol edin.

routes/api.phpphp
use Illuminate\Support\Facades\Route;

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });

    Route::post('/posts', function (Request $request) {
        // Token'ın yazma yeteneğine sahip olup olmadığını kontrol et
        if (! $request->user()->tokenCan('write')) {
            abort(403, 'Token yazma iznine sahip değil');
        }

        // Gönderi oluşturma mantığı
    });
});

Laravel mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Laravel Passport Ne Zaman Kullanılmalı

Uygulama OAuth2 yetkilendirme sunucusu olarak görev yaptığında Passport gerekli hale gelir. Yaygın senaryolar şunları içerir:

  • API ile entegrasyon oluşturan üçüncü taraf geliştiriciler
  • Mikroservisler arasında makineden makineye kimlik doğrulama
  • Kurumsal müşteriler için OAuth2 uyumluluğu gerektiren uygulamalar
  • Yenileme token rotasyonu ve JWT doğrulaması gerektiren sistemler
app/Http/Controllers/Api/PassportController.phpphp
namespace App\Http\Controllers\Api;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PassportController extends Controller
{
    public function issueToken(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (! $user || ! Hash::check($request->password, $user->password)) {
            return response()->json([
                'error' => 'invalid_credentials'
            ], 401);
        }

        // Kapsamlarla OAuth2 token oluştur
        $token = $user->createToken('API Token', ['read-posts', 'write-posts']);

        return response()->json([
            'access_token' => $token->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => $token->token->expires_at
        ]);
    }
}

Passport ayrıca kullanıcı bağlamı olmadan sunucudan sunucuya kimlik doğrulama için istemci kimlik bilgileri verme özelliğini de destekler.

php
// Makineden makineye kimlik doğrulama
// config/auth.php
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

// routes/api.php - İstemci kimlik bilgileri korumalı rota
Route::middleware('client')->group(function () {
    Route::get('/machine-data', function () {
        return response()->json(['data' => 'Makine erişimine açık']);
    });
});

Laravel API Kimlik Doğrulaması için Güvenlik En İyi Uygulamaları

Her iki paket de temel kurulumun ötesinde ek güvenlik önlemleri gerektirir. Token süre dolumu, hız sınırlama ve uygun kapsam doğrulaması yaygın güvenlik açıklarını önler.

app/Providers/AuthServiceProvider.phpphp
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;
use Laravel\Sanctum\PersonalAccessToken;

class AuthServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        // Token süre dolumu ayarla (Sanctum)
        Sanctum::authenticateAccessTokensUsing(function ($token, $isValid) {
            // Token'lar 24 saat sonra sona erer
            $expiration = config('sanctum.expiration');
            
            if ($expiration === null) {
                return $isValid;
            }

            return $isValid && $token->created_at->gt(now()->subMinutes($expiration));
        });
    }
}

Kimlik doğrulama endpoint'lerinde hız sınırlama uygulayarak kaba kuvvet saldırılarını önleyin. Laravel 12, RateLimiting facade'ı aracılığıyla esnek hız sınırlayıcı yapılandırması sağlar.

app/Providers/AppServiceProvider.phpphp
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiting;

public function boot(): void
{
    RateLimiting::for('login', function ($request) {
        return Limit::perMinute(5)->by($request->ip());
    });

    RateLimiting::for('api', function ($request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });
}

Laravel Kimlik Doğrulama Mülakat Soruları

Teknik mülakatlar sıklıkla API kimlik doğrulama kalıpları anlayışını test eder. Bu sorular tüm seviyelerdeki Laravel geliştirici mülakatlarında karşılaşılır.

S: Sanctum'da SPA kimlik doğrulaması ile token kimlik doğrulaması arasındaki fark nedir?

SPA kimlik doğrulaması, CSRF koruması ile Laravel oturum çerezlerini kullanır. Frontend, oturum oluşturmak için /sanctum/csrf-cookie çağrısı yapar, ardından sonraki istekler otomatik olarak oturum çerezini içerir. Token kimlik doğrulaması, çerezlerin pratik olmadığı mobil uygulamalar ve üçüncü taraf entegrasyonları için uygun olan Authorization header'ında Bearer token'ları kullanır.

S: Sanctum yerine Passport'u ne zaman tercih edersiniz?

Passport, yetkilendirme kodu akışı kullanarak API ile entegre olması gereken üçüncü taraf geliştiriciler veya makineden makineye kimlik doğrulamanın istemci kimlik bilgileri verme gerektirdiği durumlarda gerekli olan tam OAuth2 uygular. Sanctum birinci taraf uygulamaları daha basit bir şekilde yönetir.

S: Sanctum API token'larını nasıl saklar?

Sanctum, her token'ın SHA-256 hash'ini personal_access_tokens tablosunda saklar. Düz metin token yalnızca oluşturma sırasında bir kez döndürülür. Bu yaklaşım, ele geçirilmiş veritabanı verilerinin geçerli token'ları açığa çıkaramayacağı anlamına gelir.

S: Sanctum'da token yeteneklerini/kapsamlarını nasıl uygularsınız?

php
// Yeteneklerle token oluşturma
$token = $user->createToken('api-token', ['posts:read', 'posts:write']);

// Controller'da yetenekleri kontrol etme
if ($request->user()->tokenCan('posts:write')) {
    // Yazma işlemleri için yetkilendirildi
}

// Middleware tabanlı yetenek kontrolü
Route::middleware(['auth:sanctum', 'ability:posts:write'])
    ->post('/posts', [PostController::class, 'store']);

S: Sanctum'da bir kullanıcının tüm token'larını nasıl iptal edersiniz?

php
// Tüm token'ları iptal et
$user->tokens()->delete();

// ID ile belirli bir token'ı iptal et
$user->tokens()->where('id', $tokenId)->delete();

// Yalnızca mevcut token'ı iptal et
$request->user()->currentAccessToken()->delete();

Passport'tan Sanctum'a Geçiş

Passport ile başlayan ancak yalnızca basit token kimlik doğrulaması kullanan uygulamalar, karmaşıklığı azaltmak için Sanctum'a geçiş yapabilir. Geçiş, token oluşturma, middleware yapılandırması ve tüm kapsam kontrollerinin güncellenmesini gerektirir.

php
// Geçiş yardımcısı: Passport token'larını Sanctum'a dönüştür
use App\Models\User;
use Laravel\Passport\Token;

// Bu tek yönlü bir geçiştir - bir kez çalıştırın sonra Passport'u kaldırın
User::chunk(100, function ($users) {
    foreach ($users as $user) {
        $passportTokens = Token::where('user_id', $user->id)
            ->where('revoked', false)
            ->get();

        foreach ($passportTokens as $token) {
            $user->createToken(
                $token->name ?? 'migrated-token',
                $token->scopes ?? []
            );
        }
    }
});

Rota middleware'ini auth:api'den auth:sanctum'a güncelleyin ve $request->user()->token()->scopes'u $request->user()->currentAccessToken()->abilities ile değiştirin.

Sonuç

  • Sanctum, minimal yapılandırma ile SPA'lar, mobil uygulamalar ve birinci taraf API'ler için uygundur
  • Passport, OAuth2 yetkilendirme sunucuları ve üçüncü taraf entegrasyonları için kullanılır
  • SPA kimlik doğrulaması oturum çerezleri kullanır; API kimlik doğrulaması Bearer token'ları kullanır
  • Token yetenekleri, Sanctum'da ayrıntılı izin kontrolü sağlar
  • Hız sınırlama ve token süre dolumu, paket seçiminden bağımsız olarak temel güvenlik önlemleridir
  • Çoğu Laravel uygulaması Sanctum ile başlamalı ve yalnızca OAuth2 uyumluluğu gerektiğinde Passport eklenmelidir

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Paylaş

İlgili makaleler