@romicohen
Системный Архитектор

Как отключить редирект на /login для гостей для маршрута с ->middleware('auth:api')?

В роутах:
Route::any('/test, [TestController::class, 'main'])->middleware('auth:api');

и оно если токен неправильный - редиректит на /login

но мне для API это, понятное дело, не нужно, нужно чтобы оно просто отдавало ответ из main()

нашел в app/Http/Middleware/Authenticate.php
protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }

но даже если это просто закомментировать - все равно редиректит...

По смыслу я понимаю, что если я ему в заголовках пришлю 'application/json' - то все будет хорошо, но я не люблю, когда мне так выкручивают руки)))

Где этот редирект можно отменить?

Заранее спасибо за ответ.

//в гугле и стаке все что угодно кроме ответа на поставленный вопрос
  • Вопрос задан
  • 497 просмотров
Решения вопроса 1
@James026
1) в файле app/Exceptions/Handler.php переопределить метод unauthenticated из vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
тоесть сделать что-то такого
protected function unauthenticated($request, AuthenticationException $exception)
{
    return response()->json(['message' => $exception->getMessage()], 401)
}

но это будет глобально работать
2) сделать свой Middleware наподобии vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php
только кидать свой экспешон, и в файле app/Exceptions/Handler.php переопределить родительский метод render для обработки своей кастомной ошибки например:
public function render($request, Throwable $e)
{
    if ($e instanceof CustomAuthenticationException) {
        return response()->json(['message' => $e->getMessage()], 401);
    }
    return parent::render($request, $e); 
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы