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

Как работает авторизация через токен
В классической веб-авторизации Laravel хранит сессию на сервере.
В случае с SPA всё иначе.
После успешного входа:
- Сервер создаёт уникальный токен.
- Сохраняет его в базе данных.
- Отдаёт токен клиенту.
- Клиент отправляет этот токен в каждом защищённом запросе.
Токен передаётся в заголовке:
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% задач.
23.02.2026
0
51
Комментарии
0