Laravel Sanctum API Authentication: A Simple Beginner’s Guide

When building an API in Laravel, one of the most common ways to authenticate users is by using Laravel Sanctum.

Many beginners have questions like:

  • Do I need an AuthController?
  • Do I store tokens manually?
  • How does login work?
  • How do I protect API routes?

This guide answers all of those questions in a simple way.


What is Laravel Sanctum?

Laravel Sanctum provides a simple token-based authentication system for APIs.

The basic flow looks like this:

User Login

Laravel Creates Token

Token Stored in Database

Frontend Receives Token

Frontend Sends Token with Requests

Laravel Verifies Token

Protected APIs Become Accessible

Step 1: Install Sanctum

In newer Laravel versions:

php artisan install:api

Then run migrations:

php artisan migrate

This creates the table:

personal_access_tokens

This table stores all API tokens.


Step 2: Add HasApiTokens to User Model

Open your User model:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
}

This gives the User model the ability to create and manage API tokens.


Step 3: Create an Auth Controller

Yes, you usually create an AuthController manually.

Example:

php artisan make:controller Api/AuthController

This controller commonly contains:

  • Register
  • Login
  • Logout
  • Current User Profile

Step 4: Login and Create a Token

When a user logs in successfully:

if (!Auth::attempt($request->only('email', 'password'))) {
    return response()->json([
        'message' => 'Invalid credentials'
    ], 401);
}

$user = Auth::user();

$token = $user->createToken('api-token')->plainTextToken;

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

What happens here?

  1. Laravel checks the credentials.
  2. Sanctum creates a token.
  3. The token is stored automatically in the database.
  4. The token is returned to the frontend.

Step 5: Do We Store Tokens Manually?

No.

This is one of the best things about Sanctum.

When you run:

$user->createToken('api-token');

Sanctum automatically stores the token inside:

personal_access_tokens

You don’t need to write any database code yourself.


Step 6: Frontend Stores the Token

After login, the frontend receives:

{
    "token": "1|abcxyz123..."
}

The frontend should store this token.

Common places:

  • Local Storage
  • Session Storage
  • Secure Cookies (recommended for some applications)

Step 7: Send Token with Every Request

Whenever the frontend calls a protected API, it sends:

Authorization: Bearer TOKEN_HERE

Example:

GET /api/profile

Authorization: Bearer 1|abcxyz123...

Laravel reads this token and identifies the user.


Step 8: Protect Routes with Sanctum Middleware

Protected routes should use:

Route::middleware('auth:sanctum')->group(function () {

    Route::get('/profile', [UserController::class, 'profile']);

    Route::post('/logout', [AuthController::class, 'logout']);

});

What does this middleware do?

No TokenAccess Denied
Invalid TokenAccess Denied
Valid TokenAccess Granted

Step 9: Get the Logged-In User

Inside protected routes:

$user = auth()->user();

or

$user = $request->user();

Laravel automatically provides the authenticated user.


Step 10: Logout

To log out:

public function logout(Request $request)
{
    $request->user()->currentAccessToken()->delete();

    return response()->json([
        'message' => 'Logged out successfully'
    ]);
}

This removes the current token from the database.

After that, the token can no longer access protected APIs.


Complete Sanctum Authentication Flow

Register User

Login

Verify Credentials

Create Token

Store Token Automatically

Return Token to Frontend

Frontend Sends Bearer Token

auth:sanctum Middleware Validates Token

Access Protected Routes

Logout Deletes Token

Quick Checklist

✅ Install Sanctum

php artisan install:api

✅ Run migrations

php artisan migrate

✅ Add HasApiTokens to User model

✅ Create AuthController

✅ Generate token using createToken()

✅ Return token to frontend

✅ Protect routes using auth:sanctum

✅ Send Bearer token from frontend

✅ Delete token on logout


Conclusion

Laravel Sanctum makes API authentication extremely simple. You don’t need to manually create token tables, hash tokens, or build a custom authentication system.

The typical workflow is:

Login → Generate Token → Store Automatically → Send Bearer Token → Protect Routes with auth:sanctum → Logout by Deleting Token

Once you understand this flow, building secure REST APIs in Laravel becomes much easier.