Я хотел бы, чтобы группа маршрутов была доступна либо с помощью стандартного промежуточного программного обеспечения auth:api, либо через промежуточное программное обеспечение CheckClientCredentials.
Я не понимаю, как это возможно, поскольку нет возможности установить промежуточное ПО, поскольку оно требует только одного из перечисленных промежуточных программ.
Есть ли промежуточное программное обеспечение Passport, которое позволяет использовать любой тип аутентификации API, о котором я не знаю?
Или есть чистый способ создания настраиваемого промежуточного программного обеспечения, которое тестирует любое из промежуточного программного обеспечения?






Laravel не предоставляет промежуточное ПО ИЛИ ЖЕ. Хотя есть несколько обходных путей, как было ранее задано здесь.
Если вы ищете способ изменить промежуточное ПО по умолчанию api.php (по умолчанию - auth:api), вы можете увидеть его в каталоге: app\Providers\RouteServiceProvider.php с именем функции: mapApiRoutes().
Я последовал совету Джошуаса по поводу аналогичный ответ здесь и создал новое промежуточное ПО, включающее два промежуточных ПО аутентификации.
Рабочий класс промежуточного программного обеспечения для всех, кто сталкивается с этой проблемой ниже. Сначала будет выполнено опробование промежуточного программного обеспечения Auth guard, и если оно не сможет проверить подлинность запроса, оно затем попытается пройти проверку подлинности с помощью промежуточного программного обеспечения Client Credentials Passport.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Auth\Middleware\Authenticate as AuthGuardMiddleware;
use Laravel\Passport\Http\Middleware\CheckClientCredentials as ClientCredMiddleware;
class AuthenticateWithApiOrClientCreds
{
/**
* Authenticate a request with either Authenticate OR CheckClientCredentials Middleware
*
* @param $request
* @param Closure $next
* @param mixed ...$scopes
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function handle($request, Closure $next, ...$scopes)
{
$auth_guard_middleware = app()->make(AuthGuardMiddleware::class);
try {
$response = $auth_guard_middleware->handle($request, $next, 'api');
} catch (AuthenticationException $e) {
$client_cred_middleware = app()->make(ClientCredMiddleware::class);
$response = $client_cred_middleware->handle($request, $next, ...$scopes);
}
return $response;
}
}
В итоге я сохранил все маршруты, требующие аутентификации, в отдельном файле маршрутов под названием api-authenticated.php. В RouteServiceProvider.php я применяю группы промежуточного программного обеспечения web и api для этих маршрутов, условно в зависимости от наличия заголовка авторизации. Когда установлен заголовок авторизации, вы знаете, что пользователь является клиентом API.
В Providers/RouteServiceProvider.php:
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->apiNamespace)
->name('api.')
->group(__DIR__ . '/../../routes/api.php');
}
/**
* Define the authenticated "api" routes for the application.
*
* These routes are typically stateless, but are also used in
* a stateful context as the first-party uses cookies for
* authenticaton
*
* @return void
*/
public function mapAuthenticatedApiRoutes()
{
$stateless = request()->hasHeader('Authorization');
Route::prefix('api')
->middleware($stateless ? ['api', 'auth:api'] : ['web', 'auth'])
->namespace($this->apiNamespace)
->name('api.')
->group(__DIR__ . '/../../routes/api-authenticated.php');
}