Создание безопасного API Laravel с помощью аутентификации JWT ⋆ ALexHost SRL

Проверьте свои навыки на всех наших услугах хостинга и получите скидку 15%!.

Используйте код при регистрации:

Skills
13.02.2025

Создание безопасного 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',
],

],
Это указывает Laravel использовать драйвер jwt для API-запросов и аутентифицироваться по провайдеру 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. С помощью этой настройки вы можете дополнительно настроить логику аутентификации в вашем приложении и интегрировать дополнительные функции, такие как контроль доступа на основе ролей и маркеры обновления для длительных сессий.

Проверьте свои навыки на всех наших услугах хостинга и получите скидку 15%!.

Используйте код при регистрации:

Skills