Створення безпечного 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 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’,
],
],
Це вказує Laravel використовувати драйвер
jwt
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
використати Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject{
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims(){
return [];
}
}
Крок 7: Створення контролерів автентифікації
Створіть контролер для обробки автентифікації користувачів:
php artisan make:controller AuthController
В
AuthController.php
use App\Models\User;
використати Illuminate\Http\Request;
використати Illuminate\Support\Facades\Auth;
використати Illuminate\Support\Facades\Hash;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller{
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);}
public function login(Request $request)
{
$credentials = $request->only(’email’, ‘password’);
if (!$token = Auth::attempt($credentials)) {
return response()->json([‘error’ => ‘Невірні облікові дані’], 401);
}
return response()->json([‘token’ => $token]);
}
public function logout()
{
Auth::logout();
return response()->json([‘message’ => ‘Успішно вийшли з системи’]);
}
public function me()
{
return response()->json(Auth::user());
}
}
Крок 8: Визначте маршрути API
Додайте маршрути для автентифікації в
routes/api.php
використовуйте App\Http\Controllers\AuthController;
Route::post(‘register’,[AuthController::class, ‘register’]);
Route::post(‘login’,[AuthController::class, ‘login’]);
Route::post(‘logout’,[AuthController::class, ‘logout’])->middleware(‘auth:api’);
Route::get(‘me’,[AuthController::class, ‘me’])->middleware(‘auth:api‘);
Ці маршрути обробляють реєстрацію користувача, вхід, вихід та отримання автентифікованого користувача.
Крок 9: Захист маршрутів API
Для захисту інших маршрутів API ви можете скористатися проміжним програмним забезпеченням
auth:api
дописів
Route::middleware('auth:api')->group(function () {
Route::resource('posts', PostController::class);
});
Це гарантує, що тільки авторизовані користувачі можуть отримати доступ до цих маршрутів.
Крок 10: Тестування API
Ви можете протестувати ваш API за допомогою таких інструментів, як Postman або cURL.
- Зареєструйте користувача:
POST /api/register
Content-Type: application/json{
“name”: “John Doe”,
“email”: “john@example.com”,
“password”: “password”,
“password_confirmation”: “password”
} - Увійдіть:
POST /api/login
Content-Type: application/json{
“email”: “john@example.com”,
“password”: “password”
}Це поверне токен, який ви можете використовувати для автентифікації інших запитів.
- Доступ за захищеним маршрутом:Щоб отримати доступ за захищеним маршрутом, наприклад,, додайте токен до заголовка
GET /api/me
:авторизації
Авторизація: Пред'явник <токен>
Крок 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. За допомогою цього налаштування ви можете додатково налаштувати логіку автентифікації вашого додатку та інтегрувати додаткові функції, такі як контроль доступу на основі ролей та токени оновлення для довготривалих сесій.