Как сделать JWT авторизацию на LARAVEL (access + refresh)?

Для реализации JWT (JSON Web Token) авторизации в Laravel с использованием как токена доступа, так и токена обновления (access token + refresh token), необходимо выполнить несколько шагов.

1. Установка пакета JWT для Laravel
Для начала нужно установить пакет JWT, которые предоставляет функциональность для работы с JSON Web Token в Laravel. Выполните команду composer require tymon/jwt-auth для установки пакета.

2. Настройка провайдера сервиса
После установки необходимо добавить провайдера сервиса в файл config/app.php. Найдите массив providers и добавьте следующую строку:

TymonJWTAuthProvidersLaravelServiceProvider::class,

3. Генерация секретного ключа
Сгенерируйте секретный ключ, который будет использоваться для шифрования JWT токенов. Выполните команду php artisan jwt:secret. После выполнения команды явно укажите полученный ключ в файле .env:

JWT_SECRET=your_generated_key

4. Конфигурация пакета
Создайте конфигурационный файл для пакета JWT, выполнив команду php artisan vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider". Затем отредактируйте файл config/jwt.php для настройки дополнительных параметров, таких как время жизни токенов и других параметров по вашему усмотрению.

5. Настройка логики аутентификации
Для авторизации через JWT нужно настроить логику аутентификации в вашем Laravel приложении.

- Настройте модель пользователя (app/User.php) для использования пакета JWT, подключив трейт TymonJWTAuthContractsJWTSubject.
- Реализуйте два метода getJWTIdentifier() и getJWTCustomClaims(). Первый метод должен возвращать идентификатор пользователя, а второй - массив с дополнительными данными для токена.
- Добавьте маршруты для регистрации, аутентификации и обновления токена в вашем роутере (routes/web.php или routes/api.php), используя контроллеры или анонимные функции внизу файла.

6. Генерация и проверка токенов
Для генерации токена доступа и токена обновления, используйте следующий фрагмент кода в вашем контроллере (например, в методе login()):

use JWTAuth;

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    
    if ($token = JWTAuth::attempt($credentials)) {
        // Token доступа был успешно сгенерирован
        // Вы также можете сгенерировать и вернуть токен обновления здесь
        $refreshToken = JWTAuth::setToken($token)->getRefreshToken();
        
        return response()->json([
            'access_token' => $token,
            'refresh_token' => $refreshToken,
            'token_type' => 'bearer',
            'expires_in' => JWTAuth::factory()->getTTL() * 60,
        ]);
    }
    
    return response()->json(['error' => 'Invalid credentials'], 401);
}

Метод JWTAuth::attempt($credentials) попытается создать и вернуть новый JWT токен для указанных учетных данных пользователя. Если аутентификация пройдет успешно, то будет создан и возвращен токен доступа, а также токен обновления (если вы его сгенерировали в коде выше).

7. Защита маршрутов
Для защиты маршрутов от неавторизованного доступа, вы можете использовать middleware jwt.auth. Нужно добавить этот middleware в ваш роутер или группу маршрутов, которые требуют аутентификации:

Route::group(['middleware' => 'jwt.auth'], function () {
    // Ваш защищенный контент
});

8. Обновление токена
Для обновления токена доступа (получения нового токена после истечения срока его действия), вы можете использовать маршрут и контроллер, где пользователь будет предоставлять токен обновления и получать новый токен доступа.

Это базовая конфигурация JWT авторизации в Laravel, используя пакет JWT-Auth. Вы можете настроить дополнительные параметры, такие как проверка живости токена, добавление пользовательских полей в токен и другие функции, предоставляемые пакетом JWT-Auth.