Laravel Sanctum vs Passport 2026: āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš Laravel Sanctum āđāļĨāļ° Passport āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ

Laravel Sanctum vs Passport 2026: āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

Laravel Sanctum āđāļĨāļ° Passport āļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļāļēāļĢāđ€āļĨāļ·āļ­āļāđāļžāđ‡āļāđ€āļāļˆāļ—āļĩāđˆāđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ­āļēāļˆāļ™āļģāđ„āļ›āļŠāļđāđˆāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ—āļĩāđˆāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŦāļĢāļ·āļ­āļŠāđˆāļ­āļ‡āđ‚āļŦāļ§āđˆāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļ„āļđāđˆāļĄāļ·āļ­āļ™āļĩāđ‰āļ­āļ˜āļīāļšāļēāļĒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđāļžāđ‡āļāđ€āļāļˆāļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

āļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

Sanctum āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ SPA āđāļĨāļ° API token āđāļšāļšāļ‡āđˆāļēāļĒ Passport āđƒāļŠāđ‰āļ‡āļēāļ™ OAuth2 āđāļšāļšāđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļšāļžāļĢāđ‰āļ­āļĄ authorization codes, client credentials āđāļĨāļ° refresh tokens āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ Sanctum

Laravel Sanctum vs Passport: āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļŦāļĨāļąāļ

Sanctum āđƒāļŦāđ‰āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āđāļšāļš token āļ—āļĩāđˆāđ€āļšāļē āļ­āļ­āļāđāļšāļšāļĄāļēāļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ first-party āđāļžāđ‡āļāđ€āļāļˆāļ™āļĩāđ‰āđƒāļŠāđ‰āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ session āđāļšāļš cookie āļŠāļģāļŦāļĢāļąāļš SPA āđāļĨāļ° personal access tokens āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­āđāļĨāļ° API āđāļšāļšāļ‡āđˆāļēāļĒ

Passport āđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ” OAuth2 āļ­āļĒāđˆāļēāļ‡āļ„āļĢāļšāļ–āđ‰āļ§āļ™ āļĢāļ§āļĄāļ–āļķāļ‡ authorization servers, client credentials grants āđāļĨāļ°āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ machine-to-machine āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ™āļĩāđ‰āļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļˆāļēāļāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄ

| āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļī | Sanctum | Passport | |-----------|---------|----------| | Use Case āļŦāļĨāļąāļ | SPA, āđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­, API āđāļšāļšāļ‡āđˆāļēāļĒ | OAuth2 āļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄ, Machine-to-Machine | | āļ›āļĢāļ°āđ€āļ āļ— Token | Token hash āđāļšāļšāļ‡āđˆāļēāļĒ | JWT āļžāļĢāđ‰āļ­āļĄ OAuth2 scopes | | āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ Session | āđƒāļŠāđˆ (āđāļšāļš cookie) | āđ„āļĄāđˆ | | OAuth2 Grants | āđ„āļĄāđˆāļĄāļĩ | āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļ„āļĢāļšāļ–āđ‰āļ§āļ™ | | āļ‚āļ™āļēāļ”āđāļžāđ‡āļāđ€āļāļˆ | āđ€āļĨāđ‡āļ | āđƒāļŦāļāđˆ | | āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē | āļ‡āđˆāļēāļĒ | āļ‹āļąāļšāļ‹āđ‰āļ­āļ™ |

āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Sanctum āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ SPA

āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ SPA āļ‚āļ­āļ‡ Sanctum āļžāļķāđˆāļ‡āļžāļē session cookies āļ‚āļ­āļ‡ Laravel āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™ API tokens Frontend āđāļĨāļ° backend āļ•āđ‰āļ­āļ‡āđāļŠāļĢāđŒ top-level domain āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰

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, // Token āđ„āļĄāđˆāļŦāļĄāļ”āļ­āļēāļĒāļļāļ•āļēāļĄāļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™

    'middleware' => [
        'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
        'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
    ],
];

SPA āļ•āđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļ endpoint CSRF cookie āļāđˆāļ­āļ™āļ—āļģ request āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļŠāļĢāđ‰āļēāļ‡ session āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē 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();
}

āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ Token API āļ”āđ‰āļ§āļĒ Sanctum

āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļĄāļ·āļ­āļ–āļ·āļ­āđāļĨāļ°āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļāļąāļšāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄāđƒāļŠāđ‰ personal access tokens āđāļ—āļ™ session cookies Sanctum āđ€āļāđ‡āļš tokens āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™ hash 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 āļžāļĢāđ‰āļ­āļĄ abilities (scopes)
        $token = $user->createToken(
            $request->device_name,
            ['read', 'write'] // Abilities āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ
        );

        return response()->json([
            'token' => $token->plainTextToken,
            'expires_at' => null // āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ™ sanctum.php
        ]);
    }

    public function revokeToken(Request $request)
    {
        // āđ€āļžāļīāļāļ–āļ­āļ™ token āļ›āļąāļˆāļˆāļļāļšāļąāļ™
        $request->user()->currentAccessToken()->delete();

        return response()->json(['message' => 'āđ€āļžāļīāļāļ–āļ­āļ™ Token āļŠāļģāđ€āļĢāđ‡āļˆ']);
    }
}

āļ›āđ‰āļ­āļ‡āļāļąāļ™ routes āļ”āđ‰āļ§āļĒ middleware auth:sanctum āđƒāļŠāđ‰ method tokenCan āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļš abilities āļ‚āļ­āļ‡ token

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) {
        // āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļē token āļĄāļĩ ability write āļŦāļĢāļ·āļ­āđ„āļĄāđˆ
        if (! $request->user()->tokenCan('write')) {
            abort(403, 'Token āđ„āļĄāđˆāļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒ write');
        }

        // āļ•āļĢāļĢāļāļ°āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ post
    });
});

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Laravel āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ„āļ§āļĢāđƒāļŠāđ‰ Laravel Passport

Passport āļˆāļģāđ€āļ›āđ‡āļ™āđ€āļĄāļ·āđˆāļ­āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ authorization server OAuth2 āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļ—āļąāđˆāļ§āđ„āļ›āđ„āļ”āđ‰āđāļāđˆ:

  • āļ™āļąāļāļžāļąāļ’āļ™āļēāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļāļąāļš API
  • āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ machine-to-machine āļĢāļ°āļŦāļ§āđˆāļēāļ‡ microservices
  • āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš OAuth2 āļŠāļģāļŦāļĢāļąāļšāļĨāļđāļāļ„āđ‰āļēāļ­āļ‡āļ„āđŒāļāļĢ
  • āļĢāļ°āļšāļšāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļŦāļĄāļļāļ™āđ€āļ§āļĩāļĒāļ™ refresh token āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš 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);
        }

        // āļŠāļĢāđ‰āļēāļ‡ token OAuth2 āļžāļĢāđ‰āļ­āļĄ scopes
        $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 āļĒāļąāļ‡āļĢāļ­āļ‡āļĢāļąāļš client credentials grant āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ server-to-server āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩ context āļ‚āļ­āļ‡ user

php
// āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ machine-to-machine
// config/auth.php
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

// routes/api.php - Route āļ—āļĩāđˆāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ”āđ‰āļ§āļĒ client credentials
Route::middleware('client')->group(function () {
    Route::get('/machine-data', function () {
        return response()->json(['data' => 'āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡']);
    });
});

āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API Laravel

āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđāļžāđ‡āļāđ€āļāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĄāļēāļ•āļĢāļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™ āļāļēāļĢāļŦāļĄāļ”āļ­āļēāļĒāļļāļ‚āļ­āļ‡ token, āļāļēāļĢāļˆāļģāļāļąāļ”āļ­āļąāļ•āļĢāļē āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš scope āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ›āđ‰āļ­āļ‡āļāļąāļ™āļŠāđˆāļ­āļ‡āđ‚āļŦāļ§āđˆāļ—āļąāđˆāļ§āđ„āļ›

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
    {
        // āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļŦāļĄāļ”āļ­āļēāļĒāļļ token (Sanctum)
        Sanctum::authenticateAccessTokensUsing(function ($token, $isValid) {
            // Token āļŦāļĄāļ”āļ­āļēāļĒāļļāļŦāļĨāļąāļ‡ 24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡
            $expiration = config('sanctum.expiration');
            
            if ($expiration === null) {
                return $isValid;
            }

            return $isValid && $token->created_at->gt(now()->subMinutes($expiration));
        });
    }
}

āđƒāļŠāđ‰āļ‡āļēāļ™ rate limiting āļšāļ™ endpoints āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩ brute force Laravel 12 āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē rate limiter āļ—āļĩāđˆāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļœāđˆāļēāļ™ RateLimiting facade

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 āđāļĨāļ°āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ token āļ‚āļ­āļ‡ Sanctum āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ SPA āđƒāļŠāđ‰ session cookies āļ‚āļ­āļ‡ Laravel āļžāļĢāđ‰āļ­āļĄāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ CSRF Frontend āđ€āļĢāļĩāļĒāļ /sanctum/csrf-cookie āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ session āļˆāļēāļāļ™āļąāđ‰āļ™ requests āļ–āļąāļ”āđ„āļ›āļˆāļ°āļĢāļ§āļĄ session cookie āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ token āđƒāļŠāđ‰ Bearer tokens āđƒāļ™ Authorization header āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­āđāļĨāļ°āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļāļąāļšāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄāļ—āļĩāđˆ cookies āđ„āļĄāđˆāļŠāļ°āļ”āļ§āļ

āļ–: āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ„āļ§āļĢāđ€āļĨāļ·āļ­āļ Passport āđāļ—āļ™ Sanctum?

Passport āđƒāļŠāđ‰āļ‡āļēāļ™ OAuth2 āđāļšāļšāđ€āļ•āđ‡āļĄ āļˆāļģāđ€āļ›āđ‡āļ™āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļāļąāļš API āđ‚āļ”āļĒāđƒāļŠāđ‰ authorization code flow āļŦāļĢāļ·āļ­āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ machine-to-machine āļ•āđ‰āļ­āļ‡āļāļēāļĢ client credentials grants Sanctum āļˆāļąāļ”āļāļēāļĢāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ first-party āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļāļ§āđˆāļē

āļ–: Sanctum āđ€āļāđ‡āļš API tokens āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

Sanctum āđ€āļāđ‡āļš hash SHA-256 āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° token āđƒāļ™āļ•āļēāļĢāļēāļ‡ personal_access_tokens Token āđāļšāļš plain text āļˆāļ°āļŠāđˆāļ‡āļ„āļ·āļ™āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§āļ•āļ­āļ™āļŠāļĢāđ‰āļēāļ‡ āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļŦāļĄāļēāļĒāļ„āļ§āļēāļĄāļ§āđˆāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļšāļļāļāļĢāļļāļāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ€āļœāļĒ tokens āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰

āļ–: āļˆāļ°āđƒāļŠāđ‰āļ‡āļēāļ™ abilities/scopes āļ‚āļ­āļ‡ token āđƒāļ™ Sanctum āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

php
// āļŠāļĢāđ‰āļēāļ‡ token āļžāļĢāđ‰āļ­āļĄ abilities
$token = $user->createToken('api-token', ['posts:read', 'posts:write']);

// āļ•āļĢāļ§āļˆāļŠāļ­āļš abilities āđƒāļ™ controller
if ($request->user()->tokenCan('posts:write')) {
    // āđ„āļ”āđ‰āļĢāļąāļšāļ­āļ™āļļāļāļēāļ•āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ write
}

// āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš ability āđāļšāļš middleware
Route::middleware(['auth:sanctum', 'ability:posts:write'])
    ->post('/posts', [PostController::class, 'store']);

āļ–: āļˆāļ°āđ€āļžāļīāļāļ–āļ­āļ™ tokens āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļģāļŦāļĢāļąāļš user āđƒāļ™ Sanctum āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

php
// āđ€āļžāļīāļāļ–āļ­āļ™ tokens āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
$user->tokens()->delete();

// āđ€āļžāļīāļāļ–āļ­āļ™ token āđ€āļ‰āļžāļēāļ°āļ•āļēāļĄ ID
$user->tokens()->where('id', $tokenId)->delete();

// āđ€āļžāļīāļāļ–āļ­āļ™āđ€āļ‰āļžāļēāļ° token āļ›āļąāļˆāļˆāļļāļšāļąāļ™
$request->user()->currentAccessToken()->delete();

āļāļēāļĢāļĒāđ‰āļēāļĒāļˆāļēāļ Passport āđ„āļ›āļĒāļąāļ‡ Sanctum

āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ—āļĩāđˆāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒ Passport āđāļ•āđˆāđƒāļŠāđ‰āđ€āļ‰āļžāļēāļ°āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ token āđāļšāļšāļ‡āđˆāļēāļĒāļŠāļēāļĄāļēāļĢāļ–āļĒāđ‰āļēāļĒāđ„āļ›āļĒāļąāļ‡ Sanctum āđ€āļžāļ·āđˆāļ­āļĨāļ”āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āļāļēāļĢāļĒāđ‰āļēāļĒāļ•āđ‰āļ­āļ‡āļ­āļąāļ›āđ€āļ”āļ•āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ token, āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē middleware āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš scope

php
// āļ•āļąāļ§āļŠāđˆāļ§āļĒāļāļēāļĢāļĒāđ‰āļēāļĒ: āđāļ›āļĨāļ‡ tokens 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 āļ‚āļ­āļ‡ route āļˆāļēāļ auth:api āđ€āļ›āđ‡āļ™ auth:sanctum āđāļĨāļ°āđāļ—āļ™āļ—āļĩāđˆ $request->user()->token()->scopes āļ”āđ‰āļ§āļĒ $request->user()->currentAccessToken()->abilities

āļšāļ—āļŠāļĢāļļāļ›

  • Sanctum āđ€āļŦāļĄāļēāļ°āļāļąāļš SPA, āđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­ āđāļĨāļ° API first-party āļ”āđ‰āļ§āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”
  • Passport āļˆāļąāļ”āļāļēāļĢ authorization server OAuth2 āđāļĨāļ°āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļāļąāļšāļšāļļāļ„āļ„āļĨāļ—āļĩāđˆāļŠāļēāļĄ
  • āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ SPA āđƒāļŠāđ‰ session cookies; āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ API āđƒāļŠāđ‰ Bearer tokens
  • Token abilities āđƒāļŦāđ‰āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™ Sanctum
  • Rate limiting āđāļĨāļ°āļāļēāļĢāļŦāļĄāļ”āļ­āļēāļĒāļļ token āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļĨāļ·āļ­āļāđāļžāđ‡āļāđ€āļāļˆāđƒāļ”
  • āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ Laravel āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ„āļ§āļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒ Sanctum āđāļĨāļ°āđ€āļžāļīāđˆāļĄ Passport āđ€āļĄāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš OAuth2 āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

Laravel Livewire 3 reactive components āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

Laravel Livewire 3 āđƒāļ™āļ›āļĩ 2026: āļŠāļĢāđ‰āļēāļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ Reactive āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļš Laravel Livewire 3 āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ reactive āļ”āđ‰āļ§āļĒ PHP āļĨāđ‰āļ§āļ™ āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš component, validation āđāļšāļš real-time, āļāļēāļĢāļĢāļ§āļĄ Alpine.js āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„

āļ„āļđāđˆāļĄāļ·āļ­āđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ€āļ—āļŠāļ•āđŒ Laravel āļ”āđ‰āļ§āļĒ Pest āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Mocking, Architecture Testing āđāļĨāļ°āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„ 2026

Laravel Testing 2026: Pest, Mocking āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„

āļ„āļđāđˆāļĄāļ·āļ­āļ„āļĢāļšāļ§āļ‡āļˆāļĢāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ€āļ—āļŠāļ•āđŒ Laravel āļ”āđ‰āļ§āļĒ Pest āđƒāļ™āļ›āļĩ 2026 āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Unit Test, Feature Test, Facade Mocking, Architecture Testing, Mutation Testing āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē PHP

āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđƒāļŦāļĄāđˆāļ‚āļ­āļ‡ Laravel 12 starter kit āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđƒāļ™āļ›āļĩ 2026

Laravel 12 āđƒāļ™āļ›āļĩ 2026: āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđƒāļŦāļĄāđˆ Starter Kit āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

Laravel 12 āļ™āļģ starter kit āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāđƒāļŦāļĄāđˆāļĄāļēāļžāļĢāđ‰āļ­āļĄ React 19, Vue 3, Livewire 4 āđāļĨāļ° WorkOS AuthKit āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļŸāļĩāđ€āļˆāļ­āļĢāđŒāđƒāļŦāļĄāđˆ āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļēāļĢāļ­āļąāļ›āđ€āļāļĢāļ” āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļ›āļĩ 2026