Firebase JWT (Stateless Auth)

artiframe add jwt eklentisi, endüstri standardı olan firebase/php-jwt kütüphanesini kullanarak ArtiFrame projelerinde State-less (oturumsuz) API yetkilendirmesi yapmanızı sağlar. src/Auth/JwtAuth.php altında oluşturulan bu servis; Token Üretme, Doğrulama, Yenileme (Refresh) ve Middleware mantığıyla HTTP isteklerini bloklama (Bearer Token kontrolü) süreçlerini tek satıra indirir.

1. Kurulum ve Yapılandırma

Eklentiyi terminalden projenize dahil edin:

terminal
$ artiframe add jwt

Komut çalıştıktan sonra .env dosyanıza aşağıdaki ayarlar eklenecektir:

.env
JWT_SECRET_KEY=sizin_cok_gizli_ve_uzun_anahtariniz
JWT_ALGORITHM=HS256
JWT_EXPIRY=3600
Önemli: Canlı (Production) ortamına geçmeden önce JWT_SECRET_KEY değerini mutlaka tahmin edilemez ve uzun bir kriptografik metinle değiştirin.
2. Token Üretme (Login İşlemi)

Kullanıcı e-posta ve şifresiyle giriş yaptığında ona sunacağınız (Access Token) ve oturumu uzatmak için vereceğiniz (Refresh Token) üretim sürecidir.

AuthController.php
<?php
use Src\Auth\JwtAuth;

$jwt = new JwtAuth();

// Kullanıcının login bilgilerini doğruladıktan sonra:
$payload = [
    'user_id' => 1453,
    'role'    => 'admin',
    'email'   => '[email protected]'
];

// Access Token Üret (Süresi .env dosyasındaki JWT_EXPIRY kadardır)
$accessToken = $jwt->generate($payload);

// Refresh Token Üret (Süresi 7 gündür ve token_type = refresh claim'i içerir)
$refreshToken = $jwt->generateRefreshToken(['user_id' => 1453]);

echo json_encode([
    'access_token'  => $accessToken,
    'refresh_token' => $refreshToken
]);
MetotParametrelerAçıklama
generate()array payload, int expiryiat ve exp (Sona erme) değerlerini otomatik ekleyerek Token döner.
generateRefreshToken()array payload, int expiryVarsayılan 7 gün süreli, token_type: refresh mühürlü token döner.
3. API Rotalarını Korumak (Middleware)

Client (React/Vue/Mobil) API'lerinize istek atarken HTTP Headers kısmında Authorization: Bearer <Token> göndermelidir. Siz API metodunuzun (veya route'unuzun) en üstünde bunu tek bir fonksiyonla yakalayabilirsiniz.

UserController.php
<?php
use Src\Auth\JwtAuth;

// --- BURADAN SONRASI KORUMA ALTINDA ---
// Token yoksa, süresi geçmişse veya sahteyse bu satır anında 401 Unauthorized döner ve PHP'yi exit ile durdurur.
JwtAuth::middleware();

// Eğer kod buraya ulaştıysa; Token GÜVENLİDİR.
// Doğrulanmış kullanıcının (payload) verilerine doğrudan $_REQUEST globalinden ulaşabilirsiniz.
$activeUser = $_REQUEST['jwt_user'];

echo "Hoş geldin Kullanıcı ID: " . $activeUser['user_id'];
Middleware Gücü: Bu metot sizi her dosyada tek tek token çözme derdinden kurtarır. Eğer ArtiFrame'in apiResponse() yardımcı fonksiyonu tanımlıysa 401 yanıtını doğrudan API mimarinize uygun formatta (JSON) döndürür.
4. Manuel Token İşlemleri

Arka planda token'ı okumak, geçerliliğini denetlemek veya içindeki bir veriyi (Örn: user_id) sadece süzelmek (decode) isterseniz kullanacağınız metotlar:

Token'ı Doğrulamak (Verify)
example.php
<?php
$response = $jwt->verify($token);

if ($response['status'] === 'success') {
    $payload = $response['data'];
} else {
    // Hata detayını verir (Token has expired, Invalid token signature vs.)
    echo $response['message'];
}
Sadece Veriyi Okumak (Zorla Decode)

Token süresi dolsa bile içindeki veriyi okumak isterseniz Exception (Hata) fırlatmadan sadece Payload'ı veren metotlar:

example.php
<?php
// Payload'ı array olarak verir, çözemezse null döner.
$payload = $jwt->payload($token);

// Direkt olarak payload içindeki user_id değerini çeker
$userId = $jwt->getUserId($token);

// Sadece süresinin dolup dolmadığını (expired) kontrol eder
$isExpired = $jwt->isExpired($token);
5. Token Yenilemek (Refresh)

Süresi dolmak üzere olan veya biten bir token'ı aynı verilerle ancak yeni bir süreyle (yeni exp) tekrar üretir.

example.php
<?php
// Eski token'ı gönder, aynı verilere sahip 3600 saniyelik yepyeni bir token al
$newToken = $jwt->refresh($oldToken, 3600);