Как заставить работать и web и api авторизацию в Laravel?

Для того чтобы реализовать одновременную работу веб-авторизации и API-авторизации в Laravel, вам понадобится применить несколько шагов.

1. Установите Laravel:
В первую очередь, убедитесь, что на вашей системе установлен PHP и Composer. Затем выполните команду в терминале для создания нового проекта Laravel:

   composer create-project --prefer-dist laravel/laravel

2. Настройка маршрутов:
Laravel предоставляет мощный механизм маршрутизации для определения путей запросов в вашем приложении. Вам понадобится определить отдельные группы маршрутов для веб-авторизации и API-авторизации.

Для веб-авторизации вы можете использовать маршруты, предоставленные Laravel по умолчанию, в файле routes/web.php. Пример маршрутов:

   // Маршруты для веб-авторизации
   Route::get('/login', 'AuthController@showLoginForm');
   Route::post('/login', 'AuthController@login');
   Route::post('/logout', 'AuthController@logout');

Для API-авторизации вы можете использовать маршруты в файле routes/api.php. Пример маршрутов:

   // Маршруты для API-авторизации
   Route::post('/login', 'AuthController@login');
   Route::post('/logout', 'AuthController@logout');
   // Другие маршруты API

3. Создание контроллера:
Создайте контроллер AuthController, который будет содержать методы для аутентификации и выхода из системы. Вы можете использовать генератор контроллеров Laravel для этого:

   php artisan make:controller AuthController

Пример реализации методов login и logout в AuthController:

   <?php

   namespace AppHttpControllers;

   use IlluminateHttpRequest;
   use IlluminateSupportFacadesAuth;

   class AuthController extends Controller
   {
       public function login(Request $request)
       {
           // Валидация запроса
           $request->validate([
               'email' => 'required|email',
               'password' => 'required',
           ]);

           // Аутентификация пользователя
           if (Auth::attempt($request->only('email', 'password'))) {
               return response()->json(['message' => 'Аутентификация прошла успешно']);
           }

           return response()->json(['message' => 'Ошибка аутентификации'], 401);
       }

       public function logout()
       {
           Auth::logout();
           return response()->json(['message' => 'Выход выполнен']);
       }
   }

4. Примените маршруты и контроллер в приложении:
В файле routes/web.php сделайте импорт контроллера и примените маршруты:

   use AppHttpControllersAuthController;

   // Маршруты для веб-авторизации
   Route::get('/login', [AuthController::class, 'showLoginForm']);
   Route::post('/login', [AuthController::class, 'login']);
   Route::post('/logout', [AuthController::class, 'logout']);

В файле routes/api.php также примените маршруты:

   use AppHttpControllersAuthController;

   // Маршруты для API-авторизации
   Route::post('/login', [AuthController::class, 'login']);
   Route::post('/logout', [AuthController::class, 'logout']);

5. Настройте мидлвары:
Чтобы включить аутентификацию в вашем приложении, убедитесь, что мидлвар auth назначен в файле app/Http/Kernel.php. Если вы хотите использовать аутентификацию только для определенных маршрутов, вы можете назначить его в соответствующей группе маршрутов.

Пример использования мидлвара auth для группы маршрутов в файле routes/web.php:

   // Группа маршрутов для веб-авторизации
   Route::middleware('auth')->group(function () {
       // Защищенные маршруты
   });

Пример использования мидлвара auth для группы маршрутов в файле routes/api.php:

   // Группа маршрутов для API-авторизации
   Route::middleware('auth:api')->group(function () {
       // Защищенные маршруты
   });

6. Настройка клиентских приложений:
Если вы планируете использовать API-авторизацию с помощью токенов, необходимо настроить клиентские приложения для отправки токена аутентификации в заголовке каждого запроса к API.

Пример использования токена аутентификации в клиентском приложении (JavaScript):

   // Получение токена аутентификации во время входа в систему
   axios.post('/login', {
       email: '[email protected]',
       password: 'password123',
   }).then(response => {
       const token = response.data.token; // Полученный токен
       
       // Отправка токена в заголовке каждого запроса к API
       axios.get('/api/protected-route', {
           headers: {
               'Authorization': `Bearer ${token}`,
           },
       }).then(response => {
           console.log(response.data); // Данные защищенного маршрута API
       }).catch(error => {
           console.error(error);
       });
   }).catch(error => {
       console.error(error);
   });

Обратите внимание, что вы должны настроить аутентификацию API и генерацию токенов в файле config/auth.php.

Вот и все! Теперь у вас должны работать и веб-авторизация и API-авторизация в Laravel. Вы можете настроить и дополнительную конфигурацию, такую как различные способы аутентификации, роли и разрешения, но основная концепция остается такой же.