Створення безпечного API Laravel з аутентифікацією JWT
При створенні API за допомогою Laravel, забезпечення безпечної автентифікації має вирішальне значення, особливо при роботі з даними користувача. JSON Web Tokens (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
Відкрийте створений файл міграції в базі даних/migrations/ і додайте необхідні поля, такі як ім’я, електронна пошта та пароль:
public function 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 в модель користувача
У моделі користувача(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: Bearer <token>
Крок 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. За допомогою цього налаштування ви можете додатково налаштувати логіку автентифікації вашого додатку та інтегрувати додаткові функції, такі як контроль доступу на основі ролей та токени оновлення для довготривалих сесій.