15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
08.10.2024

Güvenli Bir Laravel API’si JWT Kimlik Doğrulaması ile Oluşturma

Laravel’de JWT (JSON Web Token) kimlik doğrulaması, sunucu tarafı oturum depolaması olmadan API tüketicilerini doğrulamak için durumsuz, kriptografik olarak imzalanmış bir mekanizma sağlar. JWT, bir yükü — genellikle kullanıcı kimliği ve talepleri — doğrulama anahtarını elinde bulunduran herhangi bir hizmetin token’ı bağımsız olarak doğrulayabilmesine olanak tanıyan, gizli veya RSA anahtarıyla imzalanmış kompakt, URL-güvenli bir dizeye kodlar.

Bu kılavuz, `tymon/jwt-auth` paketi kullanılarak Laravel API’sinde JWT kimlik doğrulamasının kurulum, model yapılandırması, controller mantığı, rota koruması, token yenileme stratejisi ve üretim güçlendirmesi dahil olmak üzere eksiksiz uygulamasını kapsamaktadır. Her adım, yüzeysel düzeydeki eğitimlerin ötesine geçen teknik bağlamı içermektedir.

Ön Koşullar ve Ortam Varsayımları

Başlamadan önce aşağıdakileri doğrulayın:

  • PHP 8.1 veya üzeri (Laravel 11 için PHP 8.2 önerilir)
  • Composer aracılığıyla yüklenmiş Laravel 10 veya 11
  • Composer 2.x
  • MySQL 8.0, PostgreSQL 15 veya PDO uyumlu herhangi bir veritabanı
  • Geçerli `DB_*` kimlik bilgilerine sahip yapılandırılmış bir `.env` dosyası
  • Laravel’in servis container’ı, middleware ve Eloquent ORM hakkında temel bilgi

Bu API’yi bir üretim ortamına dağıtıyorsanız, tam root erişimine sahip bir VPS Hosting planı, PHP-FPM’yi yapılandırmak, ortam değişkenlerini güvenli şekilde yönetmek ve dosya izinlerini doğru ayarlamak için ihtiyaç duyduğunuz kontrolü sağlar — bunların tümü JWT gizli yönetimi için kritik öneme sahiptir.

Adım 1: Yeni Bir Laravel Projesi Oluşturun

“`bash

composer create-project laravel/laravel laravel-jwt-api

cd laravel-jwt-api

“`

Kurulumu doğrulayın:

“`bash

php artisan –version

“`

Otomatik olarak oluşturulmadıysa uygulama anahtarınızı ayarlayın:

“`bash

php artisan key:generate

“`

`.env` içindeki `APP_KEY`, JWT gizlisinden ayrıdır. Her ikisi de gereklidir ve farklı kriptografik amaçlara hizmet eder — `APP_KEY` şifrelenmiş çerezleri ve oturum verilerini korurken, `JWT_SECRET` token’ları imzalar.

Adım 2: JWT Kimlik Doğrulama Paketini Yükleyin

`tymon/jwt-auth` paketi, Laravel’de JWT için fiili standarttır. Yükleyin:

“`bash

composer require tymon/jwt-auth

“`

Paket yapılandırmasını yayınlayın:

“`bash

php artisan vendor:publish –provider="TymonJWTAuthProvidersLaravelServiceProvider"

“`

Bu, token TTL’sini, yenileme TTL’sini, algoritmayı, kara liste davranışını ve gerekli talepleri kontrol eden `config/jwt.php` dosyasını oluşturur. Bu dosyayı dikkatlice inceleyin — varsayılanlar geliştirme için makul olmakla birlikte üretim için ayarlama gerektirir.

`config/jwt.php` içindeki temel yapılandırma parametreleri:

ParametreVarsayılanÜretim Önerisi
`ttl`60 dakika15–30 dakika
`refresh_ttl`20160 dakika (2 hafta)1440–10080 dakika
`algo``HS256`Dağıtık sistemler için `RS256`
`blacklist_enabled``true``true` olmalıdır
`blacklist_grace_period`0 saniyeEşzamanlı istekler için 10–30 saniye
`required_claims``['iss','iat','exp','nbf','sub','jti']`Tümünü koruyun; çok kiracılı API’ler için `aud` ekleyin

Adım 3: JWT Gizli Anahtarını Oluşturun

“`bash

php artisan jwt:secret

“`

Bu, `.env` dosyanıza `JWT_SECRET` ekler. Bu değer, varsayılan `HS256` algoritması kullanılırken tüm token’lar için HMAC-SHA256 imzalama anahtarı olarak kullanılır.

Kritik güvenlik notları:

  • `.env`’yi asla sürüm kontrolüne eklemeyin. Hemen `.gitignore`’e ekleyin.
  • Paylaşılan bir dağıtım hattında, `JWT_SECRET`’yi bir dosyada saklamak yerine CI/CD sisteminiz aracılığıyla ortam değişkeni olarak enjekte edin.
  • Gizliyi döndürürseniz, mevcut tüm token’lar anında geçersiz kılınır. Döndürme pencerelerini buna göre planlayın ve API tüketicilerine bildirin.
  • Birden fazla hizmetin token’ları doğrulaması gereken mikro hizmet mimarileri için `RS256`’e geçin. Bir RSA anahtar çifti oluşturun, özel anahtarı kimlik doğrulama hizmetinde saklayın ve yalnızca genel anahtarı tüketen hizmetlere dağıtın.

Adım 4: Kimlik Doğrulama Guard’ını Yapılandırın

`config/auth.php`’i açın ve varsayılanlar ile guard bölümlerini güncelleyin:

“`php

'defaults' => [

'guard' => 'api',

'passwords' => 'users',

],

'guards' => [

'web' => [

'driver' => 'session',

'provider' => 'users',

],

'api' => [

'driver' => 'jwt',

'provider' => 'users',

],

],

“`

Bu, Laravel’in kimlik doğrulama sistemine `api` guard’ını çözerken JWT sürücüsünü kullanmasını bildirir. `auth:api` middleware’i artık token doğrulamasını Laravel Passport veya varsayılan token sürücüsü yerine `tymon/jwt-auth`’e devredecektir.

`web` guard’ını kaldırmayın. Birçok dahili Laravel bileşeni buna bağlıdır ve kaldırılması, kimlik doğrulama sistemiyle etkileşime giren konsol komutlarında ve kuyruk işçilerinde beklenmedik hatalara neden olur.

Adım 5: Kullanıcı Modelini ve Migration’ı Oluşturun

Varsayılan `User` modeli ve migration’ı zaten mevcutsa (yeni bir Laravel kurulumunda mevcuttur), bunları doğrudan değiştirebilirsiniz. Sıfırdan başlıyorsanız:

“`bash

php artisan make:model User -m

“`

`database/migrations/` içindeki migration dosyasını açın ve şemayı tanımlayın:

“`php

public function up(): void

{

Schema::create('users', function (Blueprint $table) {

$table->id();

$table->string('name');

$table->string('email')->unique();

$table->timestamp('email_verified_at')->nullable();

$table->string('password');

$table->rememberToken();

$table->timestamps();

});

}

“`

Migration’ı çalıştırın:

“`bash

php artisan migrate

“`

Üretim notu: `APP_ENV=production` olduğu üretim ortamlarında migration’ları her zaman `–force` bayrağıyla çalıştırın, aksi takdirde Laravel onay isteyecektir:

“`bash

php artisan migrate –force

“`

Adım 6: Kullanıcı Modelinde JWTSubject Arayüzünü Uygulayın

`tymon/jwt-auth` paketi, kimlik doğrulanabilir modelinizin `JWTSubject` sözleşmesini uygulamasını gerektirir. `app/Models/User.php`’i açın:

“`php

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;

use IlluminateFoundationAuthUser as Authenticatable;

use IlluminateNotificationsNotifiable;

use TymonJWTAuthContractsJWTSubject;

class User extends Authenticatable implements JWTSubject

{

use HasFactory, Notifiable;

protected $fillable = [

'name',

'email',

'password',

];

protected $hidden = [

'password',

'remember_token',

];

protected $casts = [

'email_verified_at' => 'datetime',

'password' => 'hashed',

];

/**

  • Get the identifier that will be stored in the JWT subject claim.

*/

public function getJWTIdentifier(): mixed

{

return $this->getKey();

}

/**

  • Return a key-value array of arbitrary claims to add to the JWT payload.

*/

public function getJWTCustomClaims(): array

{

return [];

}

}

“`

Özel talepler hakkında: `getJWTCustomClaims()` yöntemi, uygulamaya özgü verileri doğrudan token yüküne gömdüğünüz yerdir. Yaygın kullanım durumları arasında aşağı akış hizmetlerinin veritabanı araması yapmadan yetkilendirme kararları alabilmesi için `role`, `tenant_id` veya `permissions` gömme yer alır. Neyi gömdüğünüz konusunda dikkatli olun — her talep token boyutunu artırır ve yükü base64 ile çözen herkes tarafından okunabilir. Parolalar veya kişisel olarak tanımlanabilir bilgiler gibi hassas verileri asla gömmeyin.

Adım 7: Kimlik Doğrulama Controller’ını Oluşturun

“`bash

php artisan make:controller AuthController

“`

`app/Http/Controllers/AuthController.php`’i tam kimlik doğrulama mantığıyla doldurun:

“`php

<?php

namespace AppHttpControllers;

use AppModelsUser;

use IlluminateHttpJsonResponse;

use IlluminateHttpRequest;

use IlluminateSupportFacadesAuth;

use IlluminateSupportFacadesHash;

use IlluminateValidationValidationException;

use TymonJWTAuthExceptionsJWTException;

use TymonJWTAuthFacadesJWTAuth;

class AuthController extends Controller

{

/**

  • Register a new user and return a JWT.

*/

public function register(Request $request): JsonResponse

{

$validated = $request->validate([

'name' => 'required|string|max:255',

'email' => 'required|string|email|max:255|unique:users',

'password' => 'required|string|min:8|confirmed',

]);

$user = User::create([

'name' => $validated['name'],

'email' => $validated['email'],

'password' => Hash::make($validated['password']),

]);

$token = JWTAuth::fromUser($user);

return response()->json([

'token' => $token,

'token_type' => 'bearer',

'expires_in' => auth('api')->factory()->getTTL() * 60,

], 201);

}

/**

  • Authenticate a user and return a JWT.

*/

public function login(Request $request): JsonResponse

{

$credentials = $request->validate([

'email' => 'required|string|email',

'password' => 'required|string',

]);

if (!$token = Auth::guard('api')->attempt($credentials)) {

return response()->json(['error' => 'Invalid credentials'], 401);

}

return $this->respondWithToken($token);

}

/**

  • Invalidate the current token (logout).

*/

public function logout(): JsonResponse

{

try {

Auth::guard('api')->logout();

} catch (JWTException $e) {

return response()->json(['error' => 'Failed to invalidate token'], 500);

}

return response()->json(['message' => 'Successfully logged out']);

}

/**

  • Refresh the current token.

*/

public function refresh(): JsonResponse

{

try {

$token = Auth::guard('api')->refresh();

} catch (JWTException $e) {

return response()->json(['error' => 'Token cannot be refreshed'], 401);

}

return $this->respondWithToken($token);

}

/**

  • Return the authenticated user's profile.

*/

public function me(): JsonResponse

{

return response()->json(Auth::guard('api')->user());

}

/**

  • Format the token response consistently.

*/

protected function respondWithToken(string $token): JsonResponse

{

return response()->json([

'token' => $token,

'token_type' => 'bearer',

'expires_in' => auth('api')->factory()->getTTL() * 60,

]);

}

}

“`

Açık guard belirtiminin önemi: Guard belirtmeden `Auth::attempt()` çağırmak varsayılan guard’a geri döner. Varsayılanı `api` olarak değiştirdiyseniz bu çalışır — ancak kırılgandır. Yeniden düzenleme sırasında varsayılan guard değiştiğinde ince hataları önlemek için her zaman `Auth::guard('api')->attempt()`’i açıkça çağırın.

Adım 8: API Rotalarını Tanımlayın

`routes/api.php`’i açın ve kimlik doğrulama ile korumalı rotaları tanımlayın:

“`php

<?php

use AppHttpControllersAuthController;

use IlluminateSupportFacadesRoute;

// Public authentication routes

Route::prefix('auth')->group(function () {

Route::post('register', [AuthController::class, 'register']);

Route::post('login', [AuthController::class, 'login']);

});

// Protected routes — require a valid JWT

Route::middleware('auth:api')->prefix('auth')->group(function () {

Route::post('logout', [AuthController::class, 'logout']);

Route::post('refresh', [AuthController::class, 'refresh']);

Route::get('me', [AuthController::class, 'me']);

});

// Example protected resource routes

Route::middleware('auth:api')->group(function () {

Route::apiResource('posts', AppHttpControllersPostController::class);

});

“`

Rota ön eki stratejisi: Kimlik doğrulama uç noktalarını `/api/auth/` altında gruplamak, API belgelerini daha temiz hale getiren ve hız sınırlama kurallarını basitleştiren yaygın olarak benimsenen bir kuraldır — `/api/auth/login`’e kaynak uç noktalarından bağımsız olarak daha sıkı kısıtlama uygulayabilirsiniz.

Adım 9: Rotaları Koruma ve Middleware Hatalarını Yönetme

Laravel’in `auth:api` middleware’i, bir token eksik, süresi dolmuş veya geçersiz olduğunda `401 Unauthenticated` yanıtı döndürür. HTML yönlendirmesi yerine tutarlı bir JSON yanıtı döndürmek için `app/Exceptions/Handler.php` içindeki `unauthenticated` yöntemini geçersiz kılın:

“`php

use IlluminateAuthAuthenticationException;

use IlluminateHttpRequest;

protected function unauthenticated($request, AuthenticationException $exception)

{

if ($request->expectsJson() || $request->is('api/*')) {

return response()->json(['error' => 'Unauthenticated'], 401);

}

return redirect()->guest(route('login'));

}

“`

Bu geçersiz kılma olmadan, API istemcileri saf bir API uygulamasında mevcut olmayan bir giriş sayfasına HTML 302 yönlendirmesi alır — entegrasyon testi sırasında yaygın bir karışıklık kaynağı.

Adım 10: Token Yenileme Stratejisi ve Kara Listeye Alma

JWT’nin durumsuz yapısı bir gerilim yaratır: token’lar kendi kendine yeterlidir ve süresi dolana kadar geçerlidir, ancak oturumu kapatma sırasında bunları iptal etmenin bir yoluna ihtiyaç duyarsınız. `tymon/jwt-auth` paketi bunu Laravel önbellek sürücüsü tarafından desteklenen bir token kara listesi ile çözer.

Kara listenin çalışma şekli:

  1. Oturum kapatmada, token’ın `jti` (JWT ID) talebi, token’ın kalan ömrüyle eşleşen bir TTL ile önbellekte saklanır.
  2. Her kimlik doğrulamalı istekte, middleware token’ı kabul etmeden önce kara listeyi kontrol eder.
  3. `blacklist_grace_period` ayarı, yenilenmekte olan bir token’ın hâlâ kullanılabildiği kısa bir pencereye izin vererek eşzamanlı istekler yapan istemcilerde yarış koşullarını önler.

Önbellek sürücünüzün bunu desteklediğinden emin olun. Varsayılan `file` sürücüsü tek sunuculu dağıtımlar için çalışır. Yük dengeli bir yapılandırmada birden fazla düğümde çalışan yatay olarak ölçeklendirilmiş API’ler için — Dedicated Servers kullanırken yaygın — Redis veya Memcached’e geçin:

“`env

CACHE_DRIVER=redis

REDIS_HOST=127.0.0.1

REDIS_PORT=6379

“`

Token yenileme akışı:

“`

Client API Server

— POST /api/auth/refresh ——>
Authorization: Bearer <old>
— Validate old token
— Blacklist old token's jti
— Issue new token
<– 200 { token: <new> } ——–

“`

Eski token, yenileme sırasında anında kara listeye alınır. İstemciler yeni token’ı saklamalı ve eskisini atmalıdır. Bunu, ön uçunuzda token yenilemeyi şeffaf bir şekilde yönetmek için bir Axios interceptor veya eşdeğeri olarak uygulayın.

Adım 11: API’yi Test Etme

Her uç noktayı doğrulamak için `curl` veya Postman kullanın.

Kullanıcı kaydı:

“`bash

curl -X POST https://your-domain.com/api/auth/register

-H "Content-Type: application/json"

-d '{

"name": "Jane Smith",

"email": "jane@example.com",

"password": "SecurePass123!",

"password_confirmation": "SecurePass123!"

}'

“`

Beklenen yanıt (`201 Created`):

“`json

{

"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9…",

"token_type": "bearer",

"expires_in": 3600

}

“`

Giriş yapma:

“`bash

curl -X POST https://your-domain.com/api/auth/login

-H "Content-Type: application/json"

-d '{"email": "jane@example.com", "password": "SecurePass123!"}'

“`

Korumalı bir rotaya erişim:

“`bash

curl -X GET https://your-domain.com/api/auth/me

-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9…"

“`

Token’ı yenileme:

“`bash

curl -X POST https://your-domain.com/api/auth/refresh

-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9…"

“`

Oturumu kapatma:

“`bash

curl -X POST https://your-domain.com/api/auth/logout

-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9…"

“`

JWT ile Oturum, Laravel Sanctum ve Passport Karşılaştırması

JWT’nin ne zaman doğru seçim olduğunu anlamak, Laravel ekosisteminde mevcut alternatiflerle karşılaştırmayı gerektirir.

KriterJWT (`tymon/jwt-auth`)Laravel SanctumLaravel PassportOturum tabanlı
**Durumsallık**DurumsuzDurumsuz (SPA token’ları) / Durumlu (çerezler)Durumlu (DB token’ları)Durumlu
**Token depolama**İstemci tarafıİstemci tarafı veya çerezVeritabanıSunucu tarafı oturum
**İptal**Kara liste (önbellek)Anında (DB silme)Anında (DB silme)Anında
**Ölçeklenebilirlik**Mükemmel (istek başına DB yok)İyiOrta (istek başına DB araması)Zayıf (oturum senkronizasyonu gerekli)
**OAuth2 desteği**HayırHayırEvet (tam OAuth2 sunucusu)Hayır
**Karmaşıklık**OrtaDüşükYüksekDüşük
**En uygun kullanım**Durumsuz API’ler, mikro hizmetlerSPA’lar, mobil uygulamalarÜçüncü taraf OAuth istemcileriGeleneksel web uygulamaları
**Token iç gözlemi**Yükü istemci tarafında çözmeAPI çağrısı gerektirirAPI çağrısı gerektirirYok

Sanctum yerine JWT’yi ne zaman seçmeli: API’niz, Laravel uygulamanızla oturum çerezi veya veritabanı bağlantısı paylaşamayan üçüncü taraf istemciler, mobil uygulamalar veya mikro hizmetler tarafından tüketiliyorsa, JWT’nin kendi kendine yeterli yapısı önemli bir avantajdır. Aynı alan adında birinci taraf bir SPA oluşturuyorsanız, çerez tabanlı kimlik doğrulamalı Sanctum daha basittir ve token depolama güvenlik endişelerini tamamen ortadan kaldırır.

Üretim Güvenliği Güçlendirmesi

Çalışan bir JWT uygulaması varsayılan olarak güvenli değildir. Yayına geçmeden önce şu güçlendirme önlemlerini uygulayın:

1. HTTPS’i koşulsuz olarak zorunlu kılın

HTTP üzerinden iletilen JWT token’ları kolayca ele geçirilebilir. TLS’yi web sunucusu düzeyinde zorunlu kılın ve tüm HTTP trafiğini yönlendirin. Her API isteği için şifreli iletim sağlamak amacıyla bunu bir SSL Sertifikası ile eşleştirin.

2. Agresif token TTL’leri ayarlayın

Kısa ömürlü erişim token’ları (15–30 dakika) ile daha uzun ömürlü yenileme token’larının (7–14 gün) kombinasyonu, çalınan bir token’ın etkisini sınırlar. `config/jwt.php`’i güncelleyin:

“`php

'ttl' => 15,

'refresh_ttl' => 10080,

“`

3. Kimlik doğrulama uç noktalarına hız sınırlaması uygulayın

Laravel’in yerleşik throttle middleware’i kaba kuvvet saldırılarını önler:

“`php

Route::middleware(['throttle:10,1'])->group(function () {

Route::post('auth/login', [AuthController::class, 'login']);

Route::post('auth/register', [AuthController::class, 'register']);

});

“`

Bu, kimlik doğrulama uç noktalarında her IP’yi dakikada 10 istekle sınırlar.

4. Çok kiracılı API’ler için `aud` talebini doğrulayın

API’niz birden fazla istemci uygulamasına hizmet veriyorsa, hizmetler arasında token yeniden kullanımını önlemek için bir `audience` talebi gömin ve doğrulayın:

“`php

// In getJWTCustomClaims()

return [

'aud' => config('app.jwt_audience'),

];

“`

5. JWT_SECRET’i işletim sistemi düzeyinde koruyun

`.env` üzerinde kısıtlayıcı dosya izinleri ayarlayın:

“`bash

chmod 640 .env

chown www-data:www-data .env

“`

Düzgün yapılandırılmış bir cPanel’li VPS‘te, sistemdeki diğer kullanıcılara gizlileri ifşa etme riski olmadan Dosya Yöneticisi veya SSH aracılığıyla dosya sahipliğini ve izinlerini yönetebilirsiniz.

6. Kimlik doğrulama olaylarını kaydedin

Anomali tespiti için başarısız giriş denemelerini, token yenilemelerini ve oturum kapatmalarını merkezi bir günlükleme hizmetine kaydetmek amacıyla Laravel’in olay sistemini entegre edin. Bu, anomali tespiti için gereklidir.

Rol Tabanlı Erişim Kontrolü Ekleme

Özel talepler, rolleri doğrudan token’a gömmek için kullanışlıdır:

“`php

// In User model

public function getJWTCustomClaims(): array

{

return [

'role' => $this->role, // e.g., 'admin', 'editor', 'viewer'

];

}

“`

Rol gereksinimlerini uygulamak için bir middleware oluşturun:

“`php

<?php

namespace AppHttpMiddleware;

use Closure;

use IlluminateHttpRequest;

use TymonJWTAuthFacadesJWTAuth;

class RoleMiddleware

{

public function handle(Request $request, Closure $next, string $role): mixed

{

$payload = JWTAuth::parseToken()->getPayload();

if ($payload->get('role') !== $role) {

return response()->json(['error' => 'Forbidden'], 403);

}

return $next($request);

}

}

“`

`app/Http/Kernel.php` (Laravel 10) veya `bootstrap/app.php` (Laravel 11) içinde kaydedin ve rotalara uygulayın:

“`php

Route::middleware(['auth:api', 'role:admin'])->group(function () {

Route::apiResource('admin/users', AdminUserController::class);

});

“`

Uyarı: Token’a gömülü rol verileri yalnızca token’ın kendisi kadar günceldir. Bir kullanıcının rolü değişirse, eski token süresi dolana veya yenilenene kadar eski rolü vermeye devam eder. Yüksek güvenlikli rol değişiklikleri için (örneğin, yönetici erişimini anında iptal etme), token kara listeye almayı kısa TTL ile birleştirin veya talep sona ermesinin yanı sıra middleware’de bir veritabanı rol kontrolü gerçekleştirin.

Laravel JWT API’leri için Dağıtım Değerlendirmeleri

Yerel geliştirmeden üretim sunucusuna geçerken, JWT davranışını etkileyen çeşitli ortama özgü faktörler vardır:

  • Saat dilimi tutarlılığı: JWT `iat`, `nbf` ve `exp` talepleri Unix zaman damgalarıdır. Saat kayması nedeniyle token reddini önlemek için sunucu saat diliminizin UTC olarak ayarlandığından emin olun (`php.ini` içinde `date.timezone = UTC`).
  • OPcache: Her istekte JWT kütüphane dosyalarını yükleme yükünü azaltmak için PHP OPcache’i etkinleştirin. Bu, özellikle yüksek trafikli API’lerde etkilidir.
  • Token temizleme için kuyruk işçileri: Özel token kara liste temizleme işleri uygularsanız, kuyruk işçinizin denetimli bir süreç olarak çalıştığından emin olun (Supervisor veya systemd).
  • Ortam değişkeni yönetimi: VPS Kontrol Panellerinde, dağıtımlar sırasında yanlışlıkla üzerine yazılmayı önlemek için üretimde `.env`’yi doğrudan düzenlemek yerine panelin ortam değişkeni yöneticisini kullanın.

Yayına Geçmeden Önce Karar Kontrol Listesi

Uygulamanızın üretime hazır olduğunu doğrulamak için bu kontrol listesini kullanın:

  • `JWT_SECRET` en az 32 karakter uzunluğunda, rastgele oluşturulmuş ve sürüm kontrolüne eklenmemiş
  • `config/jwt.php` içinde `blacklist_enabled` değeri `true` olarak ayarlanmış
  • Erişim token’ları için token TTL’si 30 dakika veya daha az
  • Yenileme TTL’si oturum politikanıza uygun bir değere ayarlanmış
  • Tüm API uç noktaları yalnızca HTTPS üzerinden sunuluyor
  • `/login` ve `/register` uç noktalarına hız sınırlaması uygulanmış
  • `unauthenticated` istisna işleyicisi HTML yönlendirmesi değil JSON döndürüyor
  • Özel talepler parola, gizli veya hassas kişisel bilgi içermiyor
  • Çok sunuculu dağıtımlarda önbellek sürücüsü Redis veya Memcached (`file` değil)
  • Kimlik doğrulama olayları kaydediliyor ve izleniyor
  • Anında etkili olması gereken rol değişiklikleri yalnızca talep sona ermesiyle değil, kara listeye alma yoluyla yönetiliyor
  • `.env` dosya izinleri web sunucusu kullanıcısıyla sınırlandırılmış

SSS

Laravel’de `JWT_SECRET` ile `APP_KEY` arasındaki fark nedir?

`APP_KEY`, Laravel’in şifreleme hizmeti tarafından çerezleri, oturum verilerini ve `Crypt::encrypt()` aracılığıyla iletilen değerleri şifrelemek için kullanılır. `JWT_SECRET` ise yalnızca `tymon/jwt-auth` tarafından JSON Web Token’larını imzalamak ve doğrulamak için kullanılır. Bunlar kriptografik olarak bağımsızdır ve tamamen farklı amaçlara hizmet eder. Her ikisi de gizli tutulmalıdır.

JWT token’ım süresi dolmamış olmasına rağmen neden 401 döndürmeye devam ediyor?

En yaygın nedenler şunlardır: token kara listeye alınmış (örneğin, oturum kapatma veya yenileme sonrasında), token verildikten sonra `JWT_SECRET` döndürülmüş, kara listeyi depolayan önbellek sürücüsü kullanılamıyor veya veren sunucu ile doğrulayan sunucu arasında `config/jwt.php` içindeki `leeway` ayarını aşan bir saat kayması var. Bunları sırayla kontrol edin.

JWT kimlik doğrulamasını Laravel kuyrukları veya konsol komutlarıyla kullanabilir miyim?

JWT, HTTP istek kimlik doğrulaması için tasarlanmıştır. Kuyruk işleri veya Artisan komutlarının içinde HTTP istek bağlamı yoktur, dolayısıyla middleware aracılığıyla bir token’dan kullanıcı çözümleyemezsiniz. Bunun yerine, kullanıcının birincil anahtarını bir iş parametresi olarak geçirin ve modeli doğrudan `User::find($userId)` ile yükleyin.

Token yenileme sırasında 401 hatası almadan eşzamanlı istekleri nasıl yönetirim?

`config/jwt.php` içindeki `blacklist_grace_period`’i 10 ile 30 saniye arasında bir değere ayarlayın. Bu pencere boyunca, yeni yenilenmiş (ve teknik olarak kara listeye alınmış) bir token hâlâ kabul edilecektir. Bu, bir yenileme devam ederken birden fazla eşzamanlı istek gönderen istemcilerde yarış koşullarını önler.

`tymon/jwt-auth` Laravel 11 ile uyumlu mu?

Mevcut sürüm döngüsü itibarıyla, `tymon/jwt-auth` sürüm `2.x`, uyumluluğu bildiren `dev-develop` dalı veya etiketli sürümler aracılığıyla Laravel 10 ve 11’i desteklemektedir. Bu pakete bağımlı bir projede Laravel sürümlerini yükseltmeden önce her zaman paketin `composer.json` kısıtlamalarını ve GitHub sorun takipçisini kontrol edin. Beklenmedik kırıcı değişiklikleri önlemek için `composer.json` içinde paket sürümünü `composer update` sırasında sabitleymeyi düşünün.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın