Давай без фокусов. Тебя достали слова «безопасность», «современные практики» и прочая маркетинговая хрень. Настоящая защита маршрутов в Laravel сводится к одному: ни один левый запрос не должен пройти. JWT (JSON Web Token) — твой инструмент для этого. Он не спасет мир, но защитит API, если ты знаешь, что делаешь. Ниже покажу, как внедрить JWT так, чтобы оно реально работало, без лишних танцев с бубном.

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

Первое, что нужно сделать — установить пакет. Точка.

composer require tymon/jwt-auth

Не хочешь вручную ковыряться с зависимостями — Composer сделает всё за тебя.

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

Пакет установлен? Отлично, теперь публикуем конфиг.

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

Это создаст config/jwt.php. Здесь ты можешь подкрутить параметры токена. Не поленись — иначе потом будешь бегать, пытаясь понять, почему JWT летит в трубу.

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

JWT без ключей — это как оружие без патронов. Генерируем:

php artisan jwt:secret

В .env появится JWT_SECRET. Не теряй его. Если потеряешь — токены всех пользователей полетят в ад.

Шаг 4: Модель User

Нам нужна модель, которая понимает JWT. Реализуем интерфейс:

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

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

Без этого твои токены будут пустыми. Да, я знаю, иногда хочется просто крикнуть: «Почему всё так сложно?». Но так работает JWT.

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

Теперь самое сладкое — middleware.

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

Любой левый запрос на /user без токена — получит 401 и заслуженно. Тут нет «может быть» или «попробуй еще раз».

Шаг 6: Аутентификация и выдача токена

Сделаем простой маршрут /login, который отдаёт токен:

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

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

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
    ]);
}

Да, это прямой и честный код. Никто не держит тебя за руку — если credentials не сходятся, токен не дают. Всё просто.

Итог

JWT в Laravel — это не какая-то магия. Это инструмент, который реально защищает твои маршруты, если не забить на детали. Не лей воду про «современные практики» — настрой middleware, генерируй ключи, делай модель правильной и не позволяй левым запросам проходить.

Если ты считаешь, что это сложно — знай: сложно только в том смысле, что кто-то решил упростить тебе жизнь и придумывает новые термины. Реально — пару команд, немного конфигов, и твое API защищено.