В 14-ом уроке мы разберем одну из ключевых тем в разработке API на Laravel, это аутентификацию. Безопасность API критически важна, особенно если вы работаете с мобильными приложениями или внешними сервисами. В этом уроке я расскажу, как использовать Laravel Sanctum для защиты ваших API-роутов, создания токенов и интеграции с клиентскими приложениями.
Sanctum это легковесный пакет для аутентификации API в Laravel. Он позволяет:
- Генерировать токены для пользователей.
- Защищать роуты с помощью этих токенов.
- Работать как с SPA, так и с мобильными приложениями.
- Управлять токенами без сложных настроек.
Если вы делаете мобильное приложение или отдельный фронтенд, Sanctum станет вашим надежным инструментом.
Установка и настройка Laravel Sanctum
Шаг 1: Установка через Composer
Откройте терминал и выполните:
composer require laravel/sanctum
Шаг 2: Публикация файлов
Запустите команду для создания миграций и конфигураций Sanctum:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
Шаг 3: Запуск миграций
Обновите базу данных:
php artisan migrate
Теперь в вашей БД появится таблица personal_access_tokens
для хранения токенов.
Шаг 4: Настройка модели User
Добавьте трейт HasApiTokens
в модель User
:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
Шаг 5: Добавление Middleware
В файле app/Http/Kernel.php
добавьте Sanctum в middleware:
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
Создание токенов для пользователей
Токены это «ключи» для доступа к API. Пользователь получает токен после авторизации и использует его в заголовках запросов.
Пример: Генерация токена при входе
Допустим, у нас есть метод login
в контроллере AuthController
:
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (Auth::attempt($credentials)) { $user = Auth::user(); // Создаем токен с именем (например, 'auth-token') $token = $user->createToken('auth-token')->plainTextToken; return response()->json([ 'token' => $token, 'user' => $user ]); } return response()->json(['error' => 'Неверные данные'], 401); }
Теперь при успешном входе пользователь получит токен.
Защита API-роутов через Sanctum
Любой защищенный роут должен проверять токен пользователя.
Пример: Защита роута
В файле routes/api.php
:
use Illuminate\Support\Facades\Route; Route::middleware('auth:sanctum')->group(function () { Route::get('/profile', function (Request $request) { return $request->user(); }); Route::post('/logout', [AuthController::class, 'logout']); });
Теперь доступ к /profile
и /logout
возможен только с валидным токеном.
Как передавать токен?
Клиент должен отправлять токен в заголовке Authorization
с префиксом Bearer
:
Authorization: Bearer 1|abcdefghijklmnopqrstuvwxyz
Пример: Мобильное приложение с API
Представим, что у нас есть мобильное приложение, которое:
- Авторизуется через наш API.
- Получает токен.
- Использует токен для доступа к защищенным данным.
Шаг 1: Авторизация
Мобильное приложение отправляет POST-запрос на /api/login
с email и паролем.
Пример запроса на JavaScript (React Native):
const login = async () => { try { const response = await fetch('https://your-api.com/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: 'user@example.com', password: 'password123', }), }); const data = await response.json(); // Сохраняем токен в AsyncStorage или SecureStore await AsyncStorage.setItem('token', data.token); } catch (error) { console.error(error); } };
Шаг 2: Доступ к защищенным данным
При каждом запросе к API приложение добавляет токен в заголовок:
const fetchProfile = async () => { const token = await AsyncStorage.getItem('token'); try { const response = await fetch('https://your-api.com/api/profile', { method: 'GET', headers: { 'Authorization': `Bearer ${token}`, }, }); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } };
Практические задачи
Чтобы закрепить материал, выполните следующие задания:
Задача 1: Реализуйте регистрацию пользователя
Создайте эндпоинт /api/register
, который:
- Принимает
name
,email
,password
. - Создает пользователя.
- Возвращает токен (аналогично методу
login
).
Подсказка: Используйте User::create()
и createToken()
.
Задача 2: Добавьте удаление токена при выходе
В методе logout
удалите текущий токен пользователя:
public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json(['message' => 'Вы вышли']); }
Задача 3: Защитите существующие роуты
Возьмите любой API-роут из вашего проекта (например, /api/posts
) и защитите его через Sanctum.
Итоги 14-го урока
Теперь вы умеете:
- Устанавливать и настраивать Sanctum.
- Создавать и управлять токенами.
- Защищать API-роуты.
- Интегрировать API с мобильным приложением.
Если что-то осталось непонятным, пишите вопросы в комментариях, помогу
Полный курс с уроками по Laravel для начинающих по ссылке https://max-gabov.ru/laravel-dlya-nachinaushih