Защита маршрутов в Laravel с помощью токенов JWT (JSON Web Tokens) позволяет обеспечить безопасный доступ к API или защищенным частям вашего приложения. JWT используются для аутентификации пользователей и передачи информации между клиентом и сервером в безопасном виде. Вот как вы можете реализовать защиту маршрутов с помощью JWT в Laravel.

Шаг 1: Установка пакета JWT

Для работы с JWT в Laravel, вам нужно установить пакет tymon/jwt-auth. Вы можете сделать это через Composer:

composer require tymon/jwt-auth

Шаг 2: Публикация конфигурационного файла

После установки пакета, вам нужно опубликовать конфигурационный файл и ключи JWT:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

Это создаст файл конфигурации config/jwt.php, где вы можете настроить параметры JWT.

Шаг 3: Генерация ключей JWT

Для генерации ключей JWT выполните следующую команду:

php artisan jwt:secret

Это создаст ключи в вашем файле .env.

Шаг 4: Настройка модели User

Ваша модель User должна реализовывать интерфейс Tymon\JWTAuth\Contracts\JWTSubject. Это позволит модели использовать JWT для аутентификации.

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    // ...

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

Шаг 5: Защита маршрутов

Теперь вы можете защитить маршруты, используя middleware jwt.auth или jwt.verify. Добавьте middleware в ваш файл routes/api.php:

Route::middleware(['jwt.auth'])->group(function () {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });
});

Шаг 6: Аутентификация и получение токена

Для аутентификации пользователя и получения JWT, вы можете создать маршрут и контроллер, который будет обрабатывать запросы на аутентификацию.

Route::post('/login', 'AuthController@login');

В контроллере AuthController:

public function login(Request $request)
{
    $credentials = $request->only(['email', 'password']);

    if (! $token = auth()->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }

    return $this->respondWithToken($token);
}

protected function respondWithToken($token)
{
    return response()->json([
        'access_token' => $token,
        'token_type' => 'bearer',
        'expires_in' => auth()->factory()->getTTL() * 60
    ]);
}

Заключение

Защита маршрутов с помощью JWT в Laravel позволяет обеспечить безопасный доступ к вашему API или защищенным частям приложения. Этот подход требует некоторой настройки, но предоставляет мощные инструменты для аутентификации и авторизации пользователей.