I looked into this further today and did manage to get the desired result using the following middleware. Is this a good solution or should I do something differently?
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate;
use Illuminate\Http\Request;
use Illuminate\Routing\Pipeline;
use Illuminate\Support\Facades\Auth;
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
use Symfony\Component\HttpFoundation\Response;
class APIAuthMiddleware {
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response {
return (new Pipeline(app()))->send($request)->through(
EnsureFrontendRequestsAreStateful::fromFrontend($request) ? $this->frontendMiddleware() : $this->externalMiddleware()
)->then(function ($request) use ($next) {
return $next($request);
});
}
/**
* Get the middleware that should be applied to requests from the "frontend".
*
* @return array
*/
protected function frontendMiddleware(): array {
Auth::shouldUse('web');
$middleware = [
EnsureFrontendRequestsAreStateful::class,
];
return $middleware;
}
/**
* Get the middleware that should be applied to requests from external applications.
*
* @return array
*/
protected function externalMiddleware(): array {
Auth::shouldUse('sanctum');
return [
Authenticate::class,
];
}
}