Изграждане на защитен API на Laravel с JWT удостоверяване
Когато изграждате API с Laravel, осигуряването на сигурна автентикация е от решаващо значение, особено при работа с потребителски данни. Уеб токените JSON (JWT) предлагат надежден метод за обработка на удостоверяването в приложения без състояние, като позволяват сигурно предаване на потребителска информация между страните. Това ръководство ще ви преведе през процеса на изграждане на сигурен API на Laravel с помощта на JWT удостоверяване.
Предварителни условия
- Основни познания за PHP и Laravel.
- Инсталирана Laravel на вашия компютър (за предпочитане Laravel 9 или по-нова версия).
- Инсталиран Composer.
- MySQL или друга база данни, създадена за вашето приложение.
Стъпка 1: Създаване на нов проект Laravel
Първо създайте нов проект Laravel с помощта на Composer:
composer create-project laravel/laravel laravel-jwt-api
 Навигирайте до директорията на проекта:
cd laravel-jwt-api
 Стъпка 2: Инсталиране на пакета за удостоверяване на JWT
Най-често използваният пакет за JWT удостоверяване в Laravel е tymon/jwt-auth. Инсталирайте го, като използвате Composer:
composer require tymon/jwt-auth
 След инсталирането на пакета публикувайте конфигурацията на JWT:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
 Това ще създаде файл config/jwt.php във вашия проект.
Стъпка 3: Генериране на секретен ключ JWT
Генерирайте секретен ключ, който JWT ще използва за подписване на токени:
php artisan jwt:secret
 Това ще добави запис JWT_SECRET към вашия .env файл, който се използва за кодиране и декодиране на токените.
Стъпка 4: Настройка на удостоверяването
За да настроите JWT удостоверяването, трябва да конфигурирате охраната по подразбиране за вашия API. Актуализирайте файла config/auth.php, както следва:
'defaults' => [
 'guard' => 'api',
 'passwords' => 'users',
 ],
 'guards' => [
 'api' => [
 'driver' => 'jwt',
 'provider' => 'users',
 ],
 ],Стъпка 5: Създаване на модела на потребителя и миграция
Ако все още не сте създали модел на потребител, можете да го създадете заедно с файла за миграция:
php artisan make:model User -m
 Отворете създадения миграционен файл в database/migrations/ и добавете необходимите полета, като име, имейл и парола:
публична функция up()
 {
 Schema::create('users', function (Blueprint $table) {
 $table->id();
 $table->string('name');
 $table->string('email')->unique();
 $table->string('password');
 $table->timestamps();
 });
 }
 Изпълнете миграцията, за да създадете таблицата users:
php artisan migrate
 Стъпка 6: Имплементиране на JWT методите в потребителския модел
В модела User(app/Models/User.php) имплементирайте интерфейса JWTSubject и необходимите методи:
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 [];
 }
 }Стъпка 7: Създаване на контролери за удостоверяване
Създайте контролер за обработка на удостоверяването на потребителите:
php artisan make:controller AuthController
 В AuthController.php добавете методи за регистриране на потребител, влизане и излизане от системата:
<?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());
 }
 }Стъпка 8: Дефиниране на маршрути на API
Добавете маршрути за удостоверяване в routes/api.php:
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']);
 });Тези маршрути обработват регистрацията на потребителя, влизането, излизането и извличането на удостоверения потребител.
Стъпка 9: Защита на маршрутите на API
За да защитите други маршрути на API, можете да използвате междинния софтуер auth:api. Например, ако имате маршрут за ресурси за публикации:
Route::middleware('auth:api')->group(function () {
 Route::resource('posts', PostController::class);
 });
 Това гарантира, че само автентифицирани потребители имат достъп до тези маршрути.
Стъпка 10: Тестване на API
Можете да тествате своя API с помощта на инструменти като Postman или cURL.
- Регистрирайте потребител:POST /api/register
 Host: your-domain.com
 Content-Type: application/json
 {
 "name": "John Doe",
 "email": "john@example.com",
 "password": "password",
 "password_confirmation": "password"
 }
- Влезте в системата:POST /api/login
 Host: your-domain.com
 Content-Type: application/json
 {
 "email": "john@example.com",
 "password": "password"
 }Това ще върне токен, който можете да използвате за удостоверяване на други заявки.
- Достъп до защитен маршрут: За да получите достъп до защитен маршрут, например GET /api/me, включете токена в заглавието Authorization:Authorization: Носител
 
Стъпка 11: Опресняване на JWT токените (по избор)
За опресняване на токена можете да добавите метод в AuthController:
public function refresh()
 {
 $token = Auth::refresh();
 return response()->json(['token' => $token]);
 }Добавете маршрута за обновяване:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
 Заключение
Следвайки това ръководство, вие създадохте защитен API на Laravel с JWT удостоверяване, което позволява регистрация на потребители, влизане и достъп до защитени маршрути. JWT ви позволява да поддържате механизъм за удостоверяване без състояние, което е особено полезно за мащабиране на API. С тази настройка можете допълнително да персонализирате логиката на удостоверяване на вашето приложение и да интегрирате допълнителни функции, като например контрол на достъпа въз основа на роли и токени за опресняване за дълготрайни сесии.


