Для реализации 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.