2 Mayıs 2025 - 12:19
PHP ile JWT (JSON Web Token) Kullanarak Kimlik Doğrulama Görseli
PHP

PHP ile JWT (JSON Web Token) Kullanarak Kimlik Doğrulama

Yorumlar
JSON Web Token (JWT), web uygulamalarında kimlik doğrulama ve yetkilendirme için yaygın olarak kullanılan güvenli bir yöntemdir. PHP ile JWT kullanarak bir kimlik doğrulama sistemi nasıl oluşturulur şimdi temel düzeyde anlatayım.

1. JWT Nedir?

JWT, üç ana bileşenden oluşur:
  • Header (Başlık): Algoritma türünü belirtir.
  • Payload (Yük): Kullanıcıya ait bilgileri içerir.
  • Signature (İmza): Token’ın değiştirilmediğini doğrulamak için kullanılır.
Bir JWT şu yapıya sahiptir:
PLAINTEXT
header.payload.signature

2. PHP için JWT Kütüphanesini Kurma

JWT işlemleri için firebase/php-jwt kütüphanesini kullanacağız. Composer ile yükleyin:
SH
composer require firebase/php-jwt

3. Gizli Anahtarı Güvenli Saklama

JWT oluştururken kullanılan secret_key değerini doğrudan kod içinde saklamak yerine bir .env dosyasında güvenli bir şekilde saklamalıyız. Bunun için vlucas/phpdotenv kütüphanesini kullanabilirsiniz:

Adım 1: dotenv Kütüphanesini Yükleyin

SH
composer require vlucas/phpdotenv

Adım 2: .env Dosyasını Oluşturun

Proje klasörünüzün kök dizinine .env dosyası oluşturun ve aşağıdaki gibi tanımlayın:
INI
SECRET_KEY=your_secret_key

Adım 3: .env Dosyasını PHP'ye Dahil Edin

PHP
use Dotenv\Dotenv;
require 'vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$secret_key = $_ENV['SECRET_KEY'];

4. JWT Oluşturma (generate_jwt.php)

PHP
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
require 'vendor/autoload.php';

$issued_at = time();
$expiration_time = $issued_at + (60 * 60); // 1 saat geçerli
$payload = [
    'iss' => 'http://localhost',
    'iat' => $issued_at,
    'exp' => $expiration_time,
    'user_id' => 1,
    'username' => 'testuser'
];

$jwt = JWT::encode($payload, $_ENV['SECRET_KEY'], 'HS256');
echo json_encode(['token' => $jwt]);

5. JWT Doğrulama (validate_jwt.php)

PHP
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
require 'vendor/autoload.php';

$headers = getallheaders();
if (!isset($headers['Authorization'])) {
    echo json_encode(['error' => 'Token bulunamadı']);
    exit;
}

token = str_replace('Bearer ', '', $headers['Authorization']);

try {
    $decoded = JWT::decode($token, new Key($_ENV['SECRET_KEY'], 'HS256'));
    echo json_encode(['message' => 'Token geçerli', 'data' => $decoded]);
} catch (Exception $e) {
    echo json_encode(['error' => 'Geçersiz token']);
}

6. Kullanıcı Girişi ile JWT Kullanımı (login.php)

PHP
session_start();
include_once 'database.php';
use Firebase\JWT\JWT;

$database = new Database();
$db = $database->getConnection();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = $_POST['email'];
    $password = $_POST['password'];

    $query = 'SELECT id, username, password FROM users WHERE email = :email';
    $stmt = $db->prepare($query);
    $stmt->bindParam(':email', $email);
    $stmt->execute();
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user && password_verify($password, $user['password'])) {
        $issued_at = time();
        $expiration_time = $issued_at + (60 * 60);
        $payload = [
            'iss' => 'http://localhost',
            'iat' => $issued_at,
            'exp' => $expiration_time,
            'user_id' => $user['id'],
            'username' => $user['username']
        ];
        
        $jwt = JWT::encode($payload, $_ENV['SECRET_KEY'], 'HS256');
        echo json_encode(['token' => $jwt]);
    } else {
        echo json_encode(['error' => 'Geçersiz e-posta veya şifre']);
    }
}

7. Güvenlik Önlemleri

  • Gizli Anahtarınızı Güvenli Saklayın: .env dosyası kullanarak your_secret_key değerini kod içinde tutmayın.
  • Token Süresini Belirleyin: Kullanıcı güvenliği için token’ların süresini kısıtlayın.
  • HTTPS Kullanın: Token’lar şifrelenmiş bir bağlantı üzerinden gönderilmelidir.
JWT, web uygulamalarında kimlik doğrulama için güçlü ve güvenli bir yöntemdir. PHP ile JWT kullanarak kullanıcı oturumlarını yönetebilir ve API isteklerini güvenli hale getirebilirsiniz. Ayrıca dotenv kullanarak hassas bilgileri güvenli bir şekilde saklamış oluruz.

Benzer Yazılar

Yorumlar ()

Henüz yorum yok. İlk yorum yapan sen ol!

Yorum Yap