Laravel Sanctum vs Passport w 2026: Uwierzytelnianie API i Pytania Rekrutacyjne
Kompleksowe porównanie Laravel Sanctum i Passport z praktycznymi przykładami kodu, najlepszymi praktykami bezpieczeństwa API oraz pytaniami rekrutacyjnymi.

Laravel Sanctum i Passport służą różnym potrzebom uwierzytelniania API, a wybór niewłaściwego pakietu prowadzi do niepotrzebnej złożoności lub luk bezpieczeństwa. Ten przewodnik szczegółowo omawia oba pakiety z praktycznymi przykładami kodu i rzeczywistymi pytaniami rekrutacyjnymi.
Sanctum obsługuje uwierzytelnianie SPA i proste tokeny API. Passport implementuje pełny OAuth2 z kodami autoryzacji, poświadczeniami klienta i tokenami odświeżania. Większość aplikacji potrzebuje Sanctum.
Laravel Sanctum vs Passport: Podstawowe Różnice
Sanctum zapewnia lekkie uwierzytelnianie oparte na tokenach, zaprojektowane dla aplikacji pierwszej strony. Pakiet wykorzystuje uwierzytelnianie oparte na ciasteczkach sesji dla SPA oraz osobiste tokeny dostępu dla aplikacji mobilnych i prostych API.
Passport implementuje pełną specyfikację OAuth2, włączając serwery autoryzacji, granty poświadczeń klienta i uwierzytelnianie maszyna-do-maszyny. Ta złożoność ma sens dla aplikacji, które muszą autoryzować dostęp stron trzecich.
| Funkcja | Sanctum | Passport | |---------|---------|----------| | Główne Zastosowanie | SPA, Aplikacje Mobilne, Proste API | OAuth2 Stron Trzecich, Maszyna-do-Maszyny | | Typ Tokena | Proste hashowane tokeny | JWT z zakresami OAuth2 | | Uwierzytelnianie Sesyjne | Tak (oparte na ciasteczkach) | Nie | | Granty OAuth2 | Brak | Pełna specyfikacja | | Rozmiar Pakietu | Minimalny | Znaczący | | Konfiguracja | Prosta | Złożona |
Implementacja Sanctum dla Uwierzytelniania SPA
Uwierzytelnianie SPA w Sanctum opiera się na ciasteczkach sesji Laravel, a nie na tokenach API. Frontend i backend muszą współdzielić tę samą domenę najwyższego poziomu, aby to działało.
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, // Tokeny domyślnie nie wygasają
'middleware' => [
'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],
];SPA musi wywołać endpoint ciasteczka CSRF przed wykonaniem uwierzytelnionych żądań. To ustanawia sesję i ustawia ciasteczko XSRF-TOKEN.
// Frontend: Inicjalizacja ochrony CSRF przed logowaniem
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();
}Uwierzytelnianie API za pomocą Tokenów Sanctum
Aplikacje mobilne i integracje stron trzecich używają osobistych tokenów dostępu zamiast ciasteczek sesji. Sanctum przechowuje te tokeny jako hashe SHA-256 w bazie danych.
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' => ['Podane dane uwierzytelniające są nieprawidłowe.'],
]);
}
// Token z uprawnieniami (zakresami)
$token = $user->createToken(
$request->device_name,
['read', 'write'] // Opcjonalne uprawnienia
);
return response()->json([
'token' => $token->plainTextToken,
'expires_at' => null // Konfiguracja w sanctum.php
]);
}
public function revokeToken(Request $request)
{
// Unieważnienie bieżącego tokena
$request->user()->currentAccessToken()->delete();
return response()->json(['message' => 'Token unieważniony']);
}
}Trasy chronione są middleware auth:sanctum. Sprawdzanie uprawnień tokena odbywa się za pomocą metody 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) {
// Sprawdzenie czy token ma uprawnienie do zapisu
if (! $request->user()->tokenCan('write')) {
abort(403, 'Token nie ma uprawnień do zapisu');
}
// Logika tworzenia posta
});
});Gotowy na rozmowy o Laravel?
Ćwicz z naszymi interaktywnymi symulatorami, flashcards i testami technicznymi.
Kiedy Używać Laravel Passport
Passport staje się niezbędny, gdy aplikacja działa jako serwer autoryzacji OAuth2. Typowe scenariusze obejmują:
- Zewnętrzni deweloperzy budujący integracje z API
- Uwierzytelnianie maszyna-do-maszyny między mikroserwisami
- Aplikacje wymagające zgodności z OAuth2 dla klientów korporacyjnych
- Systemy potrzebujące rotacji tokenów odświeżania i walidacji 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);
}
// Tworzenie tokena OAuth2 z zakresami
$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 wspiera również grant poświadczeń klienta dla uwierzytelniania serwer-do-serwera bez kontekstu użytkownika.
// Uwierzytelnianie maszyna-do-maszyny
// config/auth.php
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
// routes/api.php - Trasa chroniona poświadczeniami klienta
Route::middleware('client')->group(function () {
Route::get('/machine-data', function () {
return response()->json(['data' => 'Dostępne dla maszyn']);
});
});Najlepsze Praktyki Bezpieczeństwa dla Uwierzytelniania API Laravel
Oba pakiety wymagają dodatkowych środków bezpieczeństwa wykraczających poza podstawową konfigurację. Wygasanie tokenów, limitowanie żądań i właściwa walidacja zakresów zapobiegają typowym podatnościom.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;
use Laravel\Sanctum\PersonalAccessToken;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Ustawienie wygasania tokenów (Sanctum)
Sanctum::authenticateAccessTokensUsing(function ($token, $isValid) {
// Tokeny wygasają po 24 godzinach
$expiration = config('sanctum.expiration');
if ($expiration === null) {
return $isValid;
}
return $isValid && $token->created_at->gt(now()->subMinutes($expiration));
});
}
}Implementacja limitowania żądań na endpointach uwierzytelniania zapobiega atakom brute force. Laravel 12 zapewnia elastyczną konfigurację limitera żądań poprzez fasadę 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());
});
}Pytania Rekrutacyjne dotyczące Uwierzytelniania Laravel
Rozmowy techniczne często testują zrozumienie wzorców uwierzytelniania API. Te pytania pojawiają się na rozmowach dla programistów Laravel na wszystkich poziomach.
P: Jaka jest różnica między uwierzytelnianiem SPA a uwierzytelnianiem tokenowym w Sanctum?
Uwierzytelnianie SPA wykorzystuje ciasteczka sesji Laravel z ochroną CSRF. Frontend wywołuje /sanctum/csrf-cookie aby ustanowić sesję, a następne żądania automatycznie zawierają ciasteczko sesji. Uwierzytelnianie tokenowe używa tokenów Bearer w nagłówku Authorization, odpowiednie dla aplikacji mobilnych i integracji stron trzecich, gdzie ciasteczka są niepraktyczne.
P: Kiedy wybrać Passport zamiast Sanctum?
Passport implementuje pełny OAuth2, wymagany gdy zewnętrzni deweloperzy muszą integrować się z API używając przepływu kodu autoryzacji, lub gdy uwierzytelnianie maszyna-do-maszyny wymaga grantów poświadczeń klienta. Sanctum obsługuje aplikacje pierwszej strony w prostszy sposób.
P: Jak Sanctum przechowuje tokeny API?
Sanctum przechowuje hash SHA-256 każdego tokena w tabeli personal_access_tokens. Tekst jawny tokena jest zwracany tylko raz podczas tworzenia. To podejście oznacza, że skompromitowane dane z bazy nie mogą ujawnić ważnych tokenów.
P: Jak zaimplementować uprawnienia/zakresy tokenów w Sanctum?
// Tworzenie tokena z uprawnieniami
$token = $user->createToken('api-token', ['posts:read', 'posts:write']);
// Sprawdzanie uprawnień w kontrolerze
if ($request->user()->tokenCan('posts:write')) {
// Autoryzacja do operacji zapisu
}
// Sprawdzanie uprawnień oparte na middleware
Route::middleware(['auth:sanctum', 'ability:posts:write'])
->post('/posts', [PostController::class, 'store']);P: Jak unieważnić wszystkie tokeny użytkownika w Sanctum?
// Unieważnienie wszystkich tokenów
$user->tokens()->delete();
// Unieważnienie konkretnego tokena po ID
$user->tokens()->where('id', $tokenId)->delete();
// Unieważnienie tylko bieżącego tokena
$request->user()->currentAccessToken()->delete();Migracja z Passport do Sanctum
Aplikacje, które rozpoczęły z Passport, ale używają tylko prostego uwierzytelniania tokenowego, mogą migrować do Sanctum dla zmniejszenia złożoności. Migracja wymaga aktualizacji tworzenia tokenów, konfiguracji middleware i wszelkich sprawdzeń zakresów.
// Helper migracji: Konwersja tokenów Passport do Sanctum
use App\Models\User;
use Laravel\Passport\Token;
// To jest migracja jednokierunkowa - uruchom raz, potem usuń 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 ?? []
);
}
}
});Zaktualizuj middleware tras z auth:api na auth:sanctum i zamień $request->user()->token()->scopes na $request->user()->currentAccessToken()->abilities.
Podsumowanie
- Sanctum pasuje do SPA, aplikacji mobilnych i API pierwszej strony z minimalną konfiguracją
- Passport obsługuje serwery autoryzacji OAuth2 i integracje stron trzecich
- Uwierzytelnianie SPA używa ciasteczek sesji; uwierzytelnianie API używa tokenów Bearer
- Uprawnienia tokenów zapewniają szczegółową kontrolę dostępu w Sanctum
- Limitowanie żądań i wygasanie tokenów to niezbędne środki bezpieczeństwa niezależnie od wyboru pakietu
- Większość aplikacji Laravel powinna zacząć od Sanctum i dodać Passport tylko gdy zgodność z OAuth2 stanie się wymaganiem
Zacznij ćwiczyć!
Sprawdź swoją wiedzę z naszymi symulatorami rozmów i testami technicznymi.
Udostępnij
Powiązane artykuły

Laravel Livewire 3 w 2026 roku: Reaktywne Aplikacje i Pytania Rekrutacyjne
Kompleksowy przewodnik po Laravel Livewire 3, obejmujący reaktywne komponenty, atrybuty PHP 8, integrację Alpine.js i przygotowanie do rozmów rekrutacyjnych.

Laravel Testing w 2026: Pest, Mocking i pytania na rozmowę techniczną
Kompleksowy przewodnik po testowaniu aplikacji Laravel z wykorzystaniem Pest, mockowania fasad i Mockery. Artykuł zawiera praktyczne przykłady kodu oraz pytania techniczne przygotowujące do rozmów rekrutacyjnych.

Laravel 12 w 2026 roku: Nowe funkcje, Starter Kity i pytania rekrutacyjne
Kompletny przewodnik po Laravel 12: przebudowane Starter Kity z React 19, Vue 3, Svelte 5 i Livewire 4, integracja WorkOS AuthKit, Carbon 3, sciezka migracji z Laravel 11 oraz kluczowe pytania rekrutacyjne na 2026 rok.