JWT Kimlik Doğrulaması ile Güvenli Laravel API Oluşturma
Laravel ile API’ler oluştururken, özellikle kullanıcı verileriyle uğraşırken güvenli kimlik doğrulama sağlamak çok önemlidir. JSON Web Tokens (JWT), durum bilgisi olmayan uygulamalarda kimlik doğrulamayı işlemek için sağlam bir yöntem sunar ve kullanıcı bilgilerinin taraflar arasında güvenli bir şekilde iletilmesini sağlar. Bu kılavuz, JWT kimlik doğrulamasını kullanarak güvenli bir Laravel API oluşturma sürecinde size yol gösterecektir.
Ön Koşullar
- Temel PHP ve Laravel bilgisi.
- Makinenizde Laravel yüklü (tercihen Laravel 9 veya daha yeni).
- Composer yüklü.
- MySQL veya uygulamanız için ayarlanmış başka bir veritabanı.
Adım 1: Yeni Bir Laravel Projesi Oluşturun
İlk olarak, Composer kullanarak yeni bir Laravel projesi oluşturun:
composer create-project laravel/laravel laravel-jwt-api
Proje dizininize gidin:
cd laravel-jwt-api
Adım 2: JWT Kimlik Doğrulama Paketini Yükleyin
Laravel’de JWT kimlik doğrulaması için en yaygın kullanılan paket tymon/jwt-auth paketidir. Composer kullanarak yükleyin:
composer require tymon/jwt-auth
Paket kurulumundan sonra JWT yapılandırmasını yayınlayın:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Bu, projenizde bir config/jwt.php dosyası oluşturacaktır.
Adım 3: JWT Gizli Anahtarını Oluşturun
JWT’nin belirteçleri imzalamak için kullanacağı bir gizli anahtar oluşturun:
php artisan jwt:secret
Bu, .env dosyanıza belirteçlerin kodlanması ve kodunun çözülmesi için kullanılan bir JWT_SECRET girişi ekleyecektir.
Adım 4: Kimlik Doğrulamayı Ayarlayın
JWT kimlik doğrulamasını ayarlamak için API’niz için varsayılan korumayı yapılandırmanız gerekir. Config/auth.php dosyasını aşağıdaki gibi güncelleyin:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Adım 5: Kullanıcı Modelini ve Geçişi Oluşturun
Henüz bir Kullanıcı modeli oluşturmadıysanız, geçiş dosyasıyla birlikte oluşturabilirsiniz:
php artisan make:model User -m
Oluşturulan geçiş dosyasını veritabanı/migrations/ bölümünde açın ve ad, e-posta ve parola gibi gerekli alanları ekleyin:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
Kullanıcılar tablosunu oluşturmak için geçişi çalıştırın:
php artisan migrate
Adım 6: Kullanıcı Modelinde JWT Yöntemlerini Uygulayın
Kullanıcı modelinde(app/Models/User.php), JWTSubject arayüzünü ve gerekli yöntemleri uygulayın:
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
public function getJWTIdentifier()
{
return $this->getKey(); // Usually the primary key (id)
}
public function getJWTCustomClaims()
{
return [];
}
}
Adım 7: Kimlik Doğrulama Denetleyicileri Oluşturun
Kullanıcı kimlik doğrulamasını işlemek için bir denetleyici oluşturun:
php artisan make:controller AuthController
AuthController.php dosyasına kullanıcı kaydetme, oturum açma ve oturumu kapatma için yöntemler ekleyin:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller
{
// User Registration
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
$token = JWTAuth::fromUser($user);
return response()->json(['token' => $token], 201);
}
// User Login
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = Auth::attempt($credentials)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
return response()->json(['token' => $token]);
}
// Logout User (Invalidate Token)
public function logout()
{
Auth::logout();
return response()->json(['message' => 'Successfully logged out']);
}
// Get Authenticated User
public function me()
{
return response()->json(Auth::user());
}
}
Adım 8: API Rotalarını Tanımlayın
Routes/api.php dosyasına kimlik doğrulama için rotalar ekleyin:
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
// Protected routes (require JWT token)
Route::middleware('auth:api')->group(function () {
Route::post('logout', [AuthController::class, 'logout']);
Route::get('me', [AuthController::class, 'me']);
});
Bu rotalar kullanıcı kaydı, oturum açma, oturum kapatma ve kimliği doğrulanmış kullanıcıyı getirme işlemlerini gerçekleştirir.
Adım 9: API Rotalarını Koruma
Diğer API rotalarını korumak için auth:api ara yazılımını kullanabilirsiniz. Örneğin, gönderiler için bir kaynak rotanız varsa:
Route::middleware('auth:api')->group(function () {
Route::resource('posts', PostController::class);
});
Bu, yalnızca kimliği doğrulanmış kullanıcıların bu rotalara erişebilmesini sağlar.
Adım 10: API’nin Test Edilmesi
Postman veya cURL gibi araçları kullanarak API’nizi test edebilirsiniz.
- Register a user:
POST /api/register
Host: your-domain.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"password": "password",
"password_confirmation": "password"
} - Log in:
POST /api/login
Host: your-domain.com
Content-Type: application/json
{
"email": "john@example.com",
"password": "password"
} - Bu, diğer isteklerin kimliğini doğrulamak için kullanabileceğiniz bir belirteç döndürecektir.
- Korumalı rotaya erişim: GET /api/me gibi korumalı bir rotaya erişmek için Yetkilendirme başlığına belirteci ekleyin:
Authorization: Bearer <token>
Adım 11: JWT Belirteçlerini Yenileme (İsteğe Bağlı)
Bir token’ı yenilemek için AuthController‘a bir yöntem ekleyebilirsiniz:
public function refresh()
{
$token = Auth::refresh();
return response()->json(['token' => $token]);
}
Yenilemek için rotayı ekleyin:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
Sonuç
Bu kılavuzu takip ederek, JWT kimlik doğrulaması ile güvenli bir Laravel API’si oluşturdunuz, kullanıcı kaydı, oturum açma ve korumalı rotalara erişim sağladınız. JWT, özellikle API’leri ölçeklendirmek için yararlı olan durumsuz bir kimlik doğrulama mekanizmasını sürdürmenize olanak tanır. Bu kurulumla, uygulamanızın kimlik doğrulama mantığını daha da özelleştirebilir ve rol tabanlı erişim kontrolü ve uzun ömürlü oturumlar için yenileme belirteçleri gibi ek özellikleri entegre edebilirsiniz.