Если вы делаете SPA-приложение (React, Vue, Angular) и хотите, чтобы Laravel выступал как чистый API-backend, то Laravel Sanctum — это аккуратное и понятное решение. Он не перегружен сложным OAuth, но при этом даёт безопасную токен-авторизацию.

Ниже разберём всё последовательно: что происходит внутри, как настроить сервер, как выдаётся токен и как его правильно использовать.

34e9372c 186c 472a b166 a5c3f8fdb69e

Как работает авторизация через токен

В классической веб-авторизации Laravel хранит сессию на сервере.
В случае с SPA всё иначе.

После успешного входа:

  1. Сервер создаёт уникальный токен.
  2. Сохраняет его в базе данных.
  3. Отдаёт токен клиенту.
  4. Клиент отправляет этот токен в каждом защищённом запросе.

Токен передаётся в заголовке:

Authorization: Bearer ВАШ_ТОКЕН

Laravel проверяет токен через middleware auth:sanctum.
Если токен валиден — запрос проходит.

Это просто, прозрачно и отлично подходит для API.

Шаг 1. Установка Sanctum

Внутри Laravel-проекта выполните:

composer require laravel/sanctum

Опубликуйте конфигурацию:

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

Теперь выполните миграции:

php artisan migrate

В базе появится таблица:

personal_access_tokens

Именно в ней будут храниться все выданные токены.

Шаг 2. Подключаем Sanctum к модели пользователя

Откройте файл:

app/Models/User.php

Добавьте трейт HasApiTokens:

<?php

namespace App\Models;

use Laravel\Sanctum\HasApiTokens; // позволяет создавать API токены
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    // Разрешённые для массового заполнения поля
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    // Скрытые поля (не возвращаются в JSON)
    protected $hidden = [
        'password',
        'remember_token',
    ];
}

Теперь модель пользователя умеет создавать токены.

Шаг 3. Создаём контроллер авторизации

Создаём контроллер:

php artisan make:controller AuthController

Откройте:

app/Http/Controllers/AuthController.php

Ниже полноценная реализация с комментариями.

Регистрация пользователя

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    /**
     * Регистрация нового пользователя
     */
    public function register(Request $request)
    {
        // 1. Валидируем входящие данные
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6'
        ]);

        // 2. Создаём пользователя
        // ВАЖНО: пароль обязательно хешируем
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        // 3. Создаём токен для нового пользователя
        // plainTextToken — это токен, который мы отправим клиенту
        $token = $user->createToken('api-token')->plainTextToken;

        // 4. Возвращаем пользователя и токен
        return response()->json([
            'user' => $user,
            'token' => $token
        ]);
    }

После регистрации пользователь сразу получает токен и считается авторизованным.

Вход в систему

    /**
     * Авторизация пользователя
     */
    public function login(Request $request)
    {
        // 1. Проверяем входные данные
        $request->validate([
            'email' => 'required|email',
            'password' => 'required'
        ]);

        // 2. Ищем пользователя по email
        $user = User::where('email', $request->email)->first();

        // 3. Проверяем пароль
        if (! $user || ! Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['Неверные данные входа.'],
            ]);
        }

        // 4. Создаём новый токен
        $token = $user->createToken('api-token')->plainTextToken;

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

При каждом входе создаётся новый токен.
При желании можно удалять старые токены перед созданием нового.

Выход из системы (Logout)

    /**
     * Выход пользователя (удаление текущего токена)
     */
    public function logout(Request $request)
    {
        // Удаляем только текущий токен
        $request->user()->currentAccessToken()->delete();

        return response()->json([
            'message' => 'Вы успешно вышли из системы'
        ]);
    }
}

Шаг 4. Настройка маршрутов API

Откройте:

routes/api.php

Добавьте:

<?php

use App\Http\Controllers\AuthController;
use Illuminate\Http\Request;

// Публичные маршруты
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);

// Защищённые маршруты
Route::middleware('auth:sanctum')->group(function () {

    // Получить текущего пользователя
    Route::get('/user', function (Request $request) {
        return $request->user();
    });

    // Выход
    Route::post('/logout', [AuthController::class, 'logout']);
});

Все маршруты внутри auth:sanctum требуют токен.

Как frontend должен отправлять запросы

После логина вы получаете токен. Его нужно сохранить (например, в памяти приложения или в localStorage).

Каждый защищённый запрос отправляется так:

fetch('http://127.0.0.1:8000/api/user', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + token,
    'Accept': 'application/json'
  }
})

Если токен корректный — сервер вернёт пользователя.
Если нет — получите 401 Unauthorized.

Что происходит в базе данных

Когда создаётся токен:

  • Sanctum генерирует случайную строку
  • хеширует её
  • сохраняет в таблицу personal_access_tokens
  • связывает с пользователем

Сам токен в открытом виде хранится только на клиенте.

Это безопаснее, чем кажется: даже если база утечёт, реальные токены нельзя восстановить.

Дополнительная безопасность

Можно:

  • ограничивать срок жизни токена
  • создавать токены с правами (abilities)
  • удалять все токены пользователя при выходе

Пример удаления всех токенов:

$request->user()->tokens()->delete();

Когда выбирать Sanctum

Sanctum — лучший выбор, если:

  • у вас SPA на отдельном frontend
  • вы делаете мобильное приложение
  • нужен простой, но безопасный API
  • не требуется сложная OAuth-архитектура

Он проще Passport, быстрее настраивается и покрывает 90% задач.