Урок 14: Аутентификация API в Laravel с Sanctum

В 14-ом уроке мы разберем одну из ключевых тем в разработке API на Laravel, это аутентификацию. Безопасность API критически важна, особенно если вы работаете с мобильными приложениями или внешними сервисами. В этом уроке я расскажу, как использовать Laravel Sanctum для защиты ваших API-роутов, создания токенов и интеграции с клиентскими приложениями.

Sanctum это легковесный пакет для аутентификации API в Laravel. Он позволяет:

  • Генерировать токены для пользователей.
  • Защищать роуты с помощью этих токенов.
  • Работать как с SPA, так и с мобильными приложениями.
  • Управлять токенами без сложных настроек.

Если вы делаете мобильное приложение или отдельный фронтенд, Sanctum станет вашим надежным инструментом.

Установка и настройка Laravel Sanctum

Шаг 1: Установка через Composer

Откройте терминал и выполните:

bash
composer require laravel/sanctum

Шаг 2: Публикация файлов

Запустите команду для создания миграций и конфигураций Sanctum:

bash
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Шаг 3: Запуск миграций

Обновите базу данных:

bash
php artisan migrate

Теперь в вашей БД появится таблица personal_access_tokens для хранения токенов.

Шаг 4: Настройка модели User

Добавьте трейт HasApiTokens в модель User:

php
use Laravel\Sanctum\HasApiTokens;  

class User extends Authenticatable  
{  
    use HasApiTokens, HasFactory, Notifiable;  
}

Шаг 5: Добавление Middleware

В файле app/Http/Kernel.php добавьте Sanctum в middleware:

php
'api' => [  
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,  
    'throttle:api',  
    \Illuminate\Routing\Middleware\SubstituteBindings::class,  
],

Создание токенов для пользователей

Токены это «ключи» для доступа к API. Пользователь получает токен после авторизации и использует его в заголовках запросов.

Пример: Генерация токена при входе

Допустим, у нас есть метод login в контроллере AuthController:

php
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:

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

Представим, что у нас есть мобильное приложение, которое:

  1. Авторизуется через наш API.
  2. Получает токен.
  3. Использует токен для доступа к защищенным данным.

Шаг 1: Авторизация

Мобильное приложение отправляет POST-запрос на /api/login с email и паролем.

Пример запроса на JavaScript (React Native):

javascript
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 приложение добавляет токен в заголовок:

javascript
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, который:

  • Принимает nameemailpassword.
  • Создает пользователя.
  • Возвращает токен (аналогично методу login).

Подсказка: Используйте User::create() и createToken().

Задача 2: Добавьте удаление токена при выходе

В методе logout удалите текущий токен пользователя:

php
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