Protect API with Laravel sanctum - Gianguyen1234/app-doc GitHub Wiki

🔒 Protect API with Laravel Sanctum

Why Use Laravel Sanctum?

  • Secure API authentication 🔑
  • Supports SPA & mobile apps 📱
  • Lightweight & easy to use 🚀

1️⃣ Step 1: Install Laravel Sanctum

Run this in your Laravel project:

composer require laravel/sanctum

Then, publish the Sanctum config file:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Run database migration to create the necessary token tables:

php artisan migrate

2️⃣ Step 2: Configure Sanctum Middleware

In app/Http/Kernel.php, add Sanctum's middleware:

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

protected $middlewareGroups = [
    'api' => [
        EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

3️⃣ Step 3: Enable Sanctum in User Model

Modify app/Models/User.php:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

4️⃣ Step 4: Create API Login with Sanctum Token

Modify routes/api.php:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

Route::post('/login', function (Request $request) {
    $user = User::where('email', $request->email)->first();

    if (!$user || !Hash::check($request->password, $user->password)) {
        return response()->json(['error' => 'Invalid credentials'], 401);
    }

    // Generate Sanctum token
    $token = $user->createToken('auth-token')->plainTextToken;

    return response()->json(['token' => $token, 'user' => $user]);
});

Now, users can log in and get an API token! 🎉


5️⃣ Step 5: Protect Routes with Sanctum

Modify routes/api.php:

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Only authenticated users with a valid Sanctum token can access this route.


6️⃣ Step 6: Test API with Postman

1️⃣ Login & Get Token:
Send a POST request to /api/login with:

{
  "email": "[email protected]",
  "password": "password"
}

You’ll receive:

{
  "token": "1|H8xj8lqO9x...",
  "user": { "id": 1, "name": "John Doe" }
}

2️⃣ Use Token to Access Protected Routes:
Send a GET request to /api/user with Authorization: Bearer {token}`

If the token is valid, you'll get user details!


🔥 Done! Your API is Secure! 🚀

Now, all API routes are protected with Laravel Sanctum! 🎯