cerate middleware
php artisan make:middleware OptionalAuthSanctum
middle ware should be like this
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class OptionalAuthSanctum
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
// Attempt to authenticate only if a bearer token is provided
if ($request->bearerToken()) {
$user = Auth::guard('sanctum')->user();
if (isset($user)) {
Auth::setUser($user);
}
}
return $next($request);
}
}
Then go and register it
bootstrap/app.php
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__ . '/../routes/web.php',
api: __DIR__ . '/../routes/api.php',
commands: __DIR__ . '/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// Register the middleware alias
$middleware->alias([
'optional_auth' => \App\Http\Middleware\OptionalAuthSanctum::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
then go and use it for optional routes in api.php
eg
// feedback
Route::post('feedback', [FeedbackController::class, 'store'])->middleware('optional_auth'); //otional auth is a custom middle i craeted myself