В современном мире API‑аутентификации ключевое значение имеет безопасность и гибкость. Laravel 10 предлагает в комплекте Sanctum – легковесный пакет, который прекрасно подходит для реализации OAuth‑2.0. В этом руководстве подробно разберём, как настроить Sanctum, создать токены и реализовать механизм refresh‑токенов, чтобы ваш API оставался надёжным и масштабируемым.

Разбор задачи

Когда вы разрабатываете API, вам необходимо обеспечить защищённый доступ к ресурсам. OAuth‑2.0 предоставляет универсальный протокол, позволяющий выдавать клиентам access‑токены, а также refresh‑токены для продления сессии без повторной авторизации. Laravel Sanctum упрощает эту задачу, обрабатывая хранение токенов, проверку подписи и управление сроками жизни. В результате вы получаете готовый механизм с минимальными усилиями.

Пошаговое решение

Вы будете создавать клиентские приложения, генерировать персональные access‑токены, а также реализовать эндпоинт для обновления токенов. Для каждой операции используется простая маршрутизация, контроллеры и сервис‑классы. В процессе вы увидите, как Sanctum хранит токены в базе, как они защищены с помощью HMAC‑подписей, и как вы можете контролировать их срок действия. После завершения вы получите полностью функционирующий OAuth‑2.0 поток, готовый к использованию в мобильных и SPA‑приложениях.

рабочий код

// app/Http/Controllers/AuthController.php
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateFoundationAuthTokenGuard;

class AuthController extends Controller
{
    // Регистрация нового пользователя и выдача токена
    public function register(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ]);

        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => bcrypt($validated['password']),
        ]);

        // Создаём персональный токен
        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
        ]);
    }

    // Переиздача токена при истечении срока действия (если включено Laravel Sanctum feature)
    public function refresh(Request $request)
    {
        // В Sanctum токены не имеют срока действия по умолчанию,
        // но можно реализовать собственный механизм, например, хранить expiration
        // в пользовательском поле и проверять его здесь.
        $user = $request->user();
        $newToken = $user->createToken('auth_token')->plainTextToken;
        return response()->json(['access_token' => $newToken]);
    }
}

типичные ошибки

  • Не включён middleware ‘EnsureFrontendRequestsAreStateful’ → токен не хранится в куках.
  • Отсутствует таблица personal_access_tokens → миграция не выполнена.
  • Неправильные настройки CORS, из‑за чего запросы к API блокируются.

FAQ

1. Как защитить роуты от CSRF?

Sanctum использует куки для SPA – включите middleware VerifyCsrfToken и отправляйте XSRF-TOKEN.

2. Как обновить токен без логина?

Создайте эндпоинт, который генерирует новый токен и удаляет старый (user->tokens()->delete()).

3. Что делать, если токен не проходит проверку?

Убедитесь, что в request есть заголовок Authorization: Bearer <token> и что tokenGuard настроен в config/auth.php.

Заключение

К чек‑листу:

  • Миграции выполнены, таблица personal_access_tokens существует.
  • Middleware Sanctum и CORS настроены.
  • Регистрация и выдача токенов работают.
  • Тесты авторизации прошли.
  • Документация для фронта готова.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *