Создание безопасного API Laravel с помощью аутентификации JWT
При создании API с помощью Laravel обеспечение безопасной аутентификации имеет решающее значение, особенно при работе с пользовательскими данными. JSON Web Tokens (JWT) предлагают надежный метод обработки аутентификации в приложениях без статических данных, позволяя безопасно передавать пользовательскую информацию между сторонами. В этом руководстве вы узнаете, как создать безопасный Laravel API с использованием 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/ и добавьте необходимые поля, такие как имя, email и пароль:
public function up()
 {
 Schema::create('users', function (Blueprint $table) {
 $table->id();
 $table->string('name');
 $table->string('email')->unique();
 $table->string('password');
 $table->timestamps();
 });
 }
 Запустите миграцию для создания таблицы пользователей:
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: Bearer
 
Шаг 11: Обновление JWT-токенов (необязательно)
Чтобы обновить токен, вы можете добавить метод в AuthController:
public function refresh()
 {
 $token = Auth::refresh();
 return response()->json(['token' => $token]);
 }Добавьте маршрут для обновления:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
 Заключение
Следуя этому руководству, вы создали безопасный Laravel API с JWT-аутентификацией, обеспечивающий регистрацию пользователей, вход в систему и доступ к защищенным маршрутам. JWT позволяет поддерживать механизм аутентификации без статических данных, что особенно полезно для масштабируемых API. С помощью этой настройки вы можете дополнительно настроить логику аутентификации в вашем приложении и интегрировать дополнительные функции, такие как контроль доступа на основе ролей и маркеры обновления для длительных сессий.


