Laravel Passport - разрешить auth: api ИЛИ client_creds в группе маршрутов

Я хотел бы, чтобы группа маршрутов была доступна либо с помощью стандартного промежуточного программного обеспечения auth:api, либо через промежуточное программное обеспечение CheckClientCredentials.

Я не понимаю, как это возможно, поскольку нет возможности установить промежуточное ПО, поскольку оно требует только одного из перечисленных промежуточных программ.

Есть ли промежуточное программное обеспечение Passport, которое позволяет использовать любой тип аутентификации API, о котором я не знаю?

Или есть чистый способ создания настраиваемого промежуточного программного обеспечения, которое тестирует любое из промежуточного программного обеспечения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
576
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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');
}

Другие вопросы по теме