Laravel: Auth guard [sanctum] is not defined

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Troubleshooting Laravel Sanctum: Why Auth guard [sanctum] is not defined Appears

As a senior developer working with Laravel, integrating new authentication systems like Sanctum can sometimes lead to subtle configuration errors, even when following the documentation precisely. The error message you are encountering—Auth guard [sanctum] is not defined—is frustrating because it suggests the system doesn't recognize the authentication mechanism you are trying to invoke via middleware.

This post will diagnose why this error occurs when setting up Laravel Sanctum for API token authentication and provide the correct, robust solution.

Understanding Laravel Authentication Guards

To understand the issue, we must first look at how Laravel manages authentication guards. The auth facade and associated middleware rely entirely on the configuration defined in config/auth.php. This file defines which drivers (session, token, database) are available and what guards (like web, api) map to those drivers.

When you use Route::middleware('auth:guard_name'), Laravel looks for a guard named guard_name within the configuration. If that specific guard is not explicitly defined in the guards array of config/auth.php, it correctly throws the error: Auth guard [guard_name] is not defined.

The Sanctum Integration Discrepancy

In your provided setup, you have correctly configured the API guard to use the token driver:

php
// config/auth.php excerpt
'guards' => [
    // ...
    'api' => [
        'driver' => 'token', // This is the key piece for Sanctum tokens
        'provider' => 'users',
        'hash' => false,
    ],
],

However, you are attempting to use the middleware auth:sanctum. The core issue here is that Laravel does not automatically create a guard named sanctum just because you installed Sanctum. Instead, Sanctum integrates by leveraging one of the existing guards you define, typically the api guard you configured for token-based authentication.

The HasApiTokens trait on your Client model correctly tells Sanctum how to handle tokens, but the routing layer needs to call the guard that is actually defined in the configuration file.

The Solution: Using the Defined API Guard

The fix is straightforward: instead of referencing a non-existent guard named sanctum, you must reference the guard you explicitly configured for API token handling, which is 'api'.

You need to change your route definition from:
Route::middleware('auth:sanctum')

To:
Route::middleware('auth:api')

By using auth:api, you instruct Laravel to use the authentication logic defined for the api guard (which utilizes the token driver) to validate the incoming request, seamlessly integrating with your Sanctum token setup.

Corrected Code Example

Here is how your routes/api.php file should look after applying this correction:

php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Dashboard;


// CORRECTED LINE: Use the defined 'api' guard instead of 'sanctum'
Route::middleware('auth:api')->get('/dashboard/get_current_client/', [Dashboard::class, 'get_current_client']);

Route::get('/dashboard/client_data/', [Dashboard::class, 'client_data']);

Best Practices for API Security in Laravel

This experience highlights a crucial architectural point in building secure APIs with Laravel. When dealing with different authentication methods (session vs. token), always map those methods explicitly to the guards defined in your configuration. Following established patterns ensures that your application remains predictable and adheres to best practices, which is essential when scaling large applications using tools like those found on the Laravel documentation.

Remember that Sanctum enhances Laravel’s built-in token functionality; it doesn't replace the core authentication guard system. Always consult the official guides for the most up-to-date methods on implementing features like API tokens and middleware correctly.

By switching to auth:api, you resolve the undefined guard error, allowing your Sanctum-backed endpoints to function as intended.