Laravel Sanctum vs Passport у 2026: Автентифікація API та Питання на Співбесіді
Комплексне порівняння Laravel Sanctum та Passport з практичними прикладами коду, найкращими практиками безпеки API та питаннями для співбесід.

Laravel Sanctum та Passport обслуговують різні потреби автентифікації API, і вибір неправильного пакета призводить до непотрібної складності або прогалин у безпеці. Цей посібник детально розглядає обидва пакети з практичними прикладами коду та реальними питаннями на співбесідах.
Sanctum обробляє автентифікацію SPA та прості API токени. Passport реалізує повний OAuth2 з кодами авторизації, обліковими даними клієнта та токенами оновлення. Більшість додатків потребують Sanctum.
Laravel Sanctum vs Passport: Основні Відмінності
Sanctum забезпечує легку автентифікацію на основі токенів, розроблену для першосторонніх додатків. Пакет використовує автентифікацію на основі cookie-сесій для SPA та персональні токени доступу для мобільних додатків та простих API.
Passport реалізує повну специфікацію OAuth2, включаючи сервери авторизації, надання облікових даних клієнта та автентифікацію машина-до-машини. Ця складність має сенс для додатків, яким потрібно авторизувати доступ третіх сторін.
| Функція | Sanctum | Passport | |---------|---------|----------| | Основне Використання | SPA, Мобільні Додатки, Прості API | OAuth2 Третіх Сторін, Машина-до-Машини | | Тип Токена | Прості хешовані токени | JWT з областями OAuth2 | | Сесійна Автентифікація | Так (на основі cookie) | Ні | | OAuth2 Grants | Відсутні | Повна специфікація | | Розмір Пакета | Мінімальний | Значний | | Конфігурація | Проста | Складна |
Реалізація Sanctum для Автентифікації SPA
Автентифікація SPA в Sanctum покладається на cookie сесії Laravel, а не на API токени. Frontend та backend повинні мати спільний домен верхнього рівня для роботи цього механізму.
return [
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
'expiration' => null, // Токени за замовчуванням не закінчуються
'middleware' => [
'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],
];SPA повинен викликати endpoint CSRF cookie перед виконанням автентифікованих запитів. Це встановлює сесію та налаштовує cookie XSRF-TOKEN.
// Frontend: Ініціалізація захисту CSRF перед входом
async function initializeAuth() {
await fetch('/sanctum/csrf-cookie', {
credentials: 'include'
});
}
async function login(email, password) {
await initializeAuth();
const response = await fetch('/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-XSRF-TOKEN': getCookie('XSRF-TOKEN'),
'Accept': 'application/json'
},
credentials: 'include',
body: JSON.stringify({ email, password })
});
return response.json();
}Автентифікація API за допомогою Токенів Sanctum
Мобільні додатки та інтеграції третіх сторін використовують персональні токени доступу замість cookie сесії. Sanctum зберігає ці токени як SHA-256 хеші в базі даних.
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 createToken(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['Надані облікові дані невірні.'],
]);
}
// Токен з можливостями (областями)
$token = $user->createToken(
$request->device_name,
['read', 'write'] // Опціональні можливості
);
return response()->json([
'token' => $token->plainTextToken,
'expires_at' => null // Налаштування в sanctum.php
]);
}
public function revokeToken(Request $request)
{
// Скасування поточного токена
$request->user()->currentAccessToken()->delete();
return response()->json(['message' => 'Токен скасовано']);
}
}Маршрути захищаються middleware auth:sanctum. Перевірка можливостей токена здійснюється за допомогою методу tokenCan.
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->group(function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::post('/posts', function (Request $request) {
// Перевірка чи токен має можливість запису
if (! $request->user()->tokenCan('write')) {
abort(403, 'Токен не має дозволу на запис');
}
// Логіка створення поста
});
});Готовий до співбесід з Laravel?
Практикуйся з нашими інтерактивними симуляторами, flashcards та технічними тестами.
Коли Використовувати Laravel Passport
Passport стає необхідним, коли додаток діє як сервер авторизації OAuth2. Типові сценарії включають:
- Сторонні розробники, що створюють інтеграції з API
- Автентифікація машина-до-машини між мікросервісами
- Додатки, що вимагають відповідності OAuth2 для корпоративних клієнтів
- Системи, що потребують ротації токенів оновлення та валідації JWT
namespace App\Http\Controllers\Api;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PassportController extends Controller
{
public function issueToken(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
return response()->json([
'error' => 'invalid_credentials'
], 401);
}
// Створення OAuth2 токена з областями
$token = $user->createToken('API Token', ['read-posts', 'write-posts']);
return response()->json([
'access_token' => $token->accessToken,
'token_type' => 'Bearer',
'expires_at' => $token->token->expires_at
]);
}
}Passport також підтримує надання облікових даних клієнта для автентифікації сервер-до-сервера без контексту користувача.
// Автентифікація машина-до-машини
// config/auth.php
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
// routes/api.php - Маршрут захищений обліковими даними клієнта
Route::middleware('client')->group(function () {
Route::get('/machine-data', function () {
return response()->json(['data' => 'Доступно для машин']);
});
});Найкращі Практики Безпеки для Автентифікації Laravel API
Обидва пакети вимагають додаткових заходів безпеки понад базове налаштування. Закінчення терміну дії токенів, обмеження швидкості та належна валідація областей запобігають типовим вразливостям.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;
use Laravel\Sanctum\PersonalAccessToken;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Встановлення закінчення терміну токенів (Sanctum)
Sanctum::authenticateAccessTokensUsing(function ($token, $isValid) {
// Токени закінчуються через 24 години
$expiration = config('sanctum.expiration');
if ($expiration === null) {
return $isValid;
}
return $isValid && $token->created_at->gt(now()->subMinutes($expiration));
});
}
}Реалізація обмеження швидкості на endpoint автентифікації запобігає атакам грубої сили. Laravel 12 надає гнучке налаштування обмежувача швидкості через фасад RateLimiting.
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiting;
public function boot(): void
{
RateLimiting::for('login', function ($request) {
return Limit::perMinute(5)->by($request->ip());
});
RateLimiting::for('api', function ($request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}Питання на Співбесіді щодо Автентифікації Laravel
Технічні співбесіди часто перевіряють розуміння патернів автентифікації API. Ці питання з'являються на співбесідах для Laravel розробників усіх рівнів.
П: Яка різниця між автентифікацією SPA та токенною автентифікацією в Sanctum?
Автентифікація SPA використовує cookie сесії Laravel з захистом CSRF. Frontend викликає /sanctum/csrf-cookie для встановлення сесії, а подальші запити автоматично включають cookie сесії. Токенна автентифікація використовує Bearer токени в заголовку Authorization, що підходить для мобільних додатків та інтеграцій третіх сторін, де cookie непрактичні.
П: Коли обирати Passport замість Sanctum?
Passport реалізує повний OAuth2, необхідний коли сторонні розробники повинні інтегруватися з API за допомогою потоку коду авторизації, або коли автентифікація машина-до-машини вимагає надання облікових даних клієнта. Sanctum обробляє першосторонні додатки простіше.
П: Як Sanctum зберігає API токени?
Sanctum зберігає SHA-256 хеш кожного токена в таблиці personal_access_tokens. Відкритий текст токена повертається лише один раз під час створення. Цей підхід означає, що скомпрометовані дані бази даних не можуть розкрити дійсні токени.
П: Як реалізувати можливості/області токенів в Sanctum?
// Створення токена з можливостями
$token = $user->createToken('api-token', ['posts:read', 'posts:write']);
// Перевірка можливостей в контролері
if ($request->user()->tokenCan('posts:write')) {
// Авторизовано для операцій запису
}
// Перевірка можливостей на основі middleware
Route::middleware(['auth:sanctum', 'ability:posts:write'])
->post('/posts', [PostController::class, 'store']);П: Як скасувати всі токени користувача в Sanctum?
// Скасування всіх токенів
$user->tokens()->delete();
// Скасування конкретного токена за ID
$user->tokens()->where('id', $tokenId)->delete();
// Скасування лише поточного токена
$request->user()->currentAccessToken()->delete();Міграція з Passport на Sanctum
Додатки, які розпочали з Passport, але використовують лише просту токенну автентифікацію, можуть мігрувати на Sanctum для зменшення складності. Міграція вимагає оновлення створення токенів, конфігурації middleware та будь-яких перевірок областей.
// Помічник міграції: Конвертація токенів Passport у Sanctum
use App\Models\User;
use Laravel\Passport\Token;
// Це односторонння міграція - запустіть один раз, потім видаліть Passport
User::chunk(100, function ($users) {
foreach ($users as $user) {
$passportTokens = Token::where('user_id', $user->id)
->where('revoked', false)
->get();
foreach ($passportTokens as $token) {
$user->createToken(
$token->name ?? 'migrated-token',
$token->scopes ?? []
);
}
}
});Оновіть middleware маршрутів з auth:api на auth:sanctum та замініть $request->user()->token()->scopes на $request->user()->currentAccessToken()->abilities.
Висновок
- Sanctum підходить для SPA, мобільних додатків та першосторонніх API з мінімальною конфігурацією
- Passport обробляє сервери авторизації OAuth2 та інтеграції третіх сторін
- Автентифікація SPA використовує cookie сесії; автентифікація API використовує Bearer токени
- Можливості токенів забезпечують детальний контроль дозволів в Sanctum
- Обмеження швидкості та закінчення терміну дії токенів є необхідними заходами безпеки незалежно від вибору пакета
- Більшість додатків Laravel повинні починати з Sanctum і додавати Passport лише коли відповідність OAuth2 стає вимогою
Починай практикувати!
Перевір свої знання з нашими симуляторами співбесід та технічними тестами.
Поділитися
Пов'язані статті

Laravel Livewire 3 у 2026 році: Реактивні Застосунки та Питання на Співбесідах
Вичерпний посібник з Laravel Livewire 3, що охоплює реактивні компоненти, атрибути PHP 8, інтеграцію Alpine.js та підготовку до технічних співбесід.

Тестування Laravel у 2026: Pest, Mocking та питання технічних співбесід
Повний посібник з тестування Laravel-застосунків за допомогою Pest у 2026 році. Розглядаються Feature та Unit тести, мокінг фасадів, архітектурні тести, мутаційне тестування та типові питання технічних співбесід.

Laravel 12 у 2026 році: нові можливості, Starter Kits та питання для співбесіди
Повний огляд Laravel 12: перероблені Starter Kits на основі React 19, Vue 3, Svelte 5 та Livewire 4, інтеграція WorkOS AuthKit, оновлення залежностей до Carbon 3 та PHP 8.2+, покроковий посібник з оновлення з Laravel 11 та актуальні питання для технічних співбесід у 2026 році.