
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.
PLAINTEXT
header.payload.signature
2. PHP için JWT Kütüphanesini Kurma
JWT işlemleri içinfirebase/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ı kullanarakyour_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.
Benzer Yazılar
Yorumlar ()
Henüz yorum yok. İlk yorum yapan sen ol!