Laravel Sanctum vs Passport у 2026: Автентифікація API та Питання на Співбесіді

Комплексне порівняння Laravel Sanctum та Passport з практичними прикладами коду, найкращими практиками безпеки API та питаннями для співбесід.

Laravel Sanctum vs Passport у 2026: Автентифікація 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 повинні мати спільний домен верхнього рівня для роботи цього механізму.

config/sanctum.phpphp
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.

javascript
// 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 хеші в базі даних.

app/Http/Controllers/AuthController.phpphp
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.

routes/api.phpphp
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
app/Http/Controllers/Api/PassportController.phpphp
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 також підтримує надання облікових даних клієнта для автентифікації сервер-до-сервера без контексту користувача.

php
// Автентифікація машина-до-машини
// 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

Обидва пакети вимагають додаткових заходів безпеки понад базове налаштування. Закінчення терміну дії токенів, обмеження швидкості та належна валідація областей запобігають типовим вразливостям.

app/Providers/AuthServiceProvider.phpphp
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.

app/Providers/AppServiceProvider.phpphp
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?

php
// Створення токена з можливостями
$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?

php
// Скасування всіх токенів
$user->tokens()->delete();

// Скасування конкретного токена за ID
$user->tokens()->where('id', $tokenId)->delete();

// Скасування лише поточного токена
$request->user()->currentAccessToken()->delete();

Міграція з Passport на Sanctum

Додатки, які розпочали з Passport, але використовують лише просту токенну автентифікацію, можуть мігрувати на Sanctum для зменшення складності. Міграція вимагає оновлення створення токенів, конфігурації middleware та будь-яких перевірок областей.

php
// Помічник міграції: Конвертація токенів 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 стає вимогою

Починай практикувати!

Перевір свої знання з нашими симуляторами співбесід та технічними тестами.

Поділитися

Пов'язані статті