Laravel Airlock как вернуть разные ответы на неаутентифицированные веб-запросы и запросы API

Я разрабатываю мобильное приложение и веб-сайт с помощью laravel + react native.

Когда вы отправляете запрос на маршрут с помощью промежуточного программного обеспечения "auth:airlock", если вы передаете неправильный токен Bearer, он перенаправляет вас на страницу /login. Я хочу вернуть ответ ("Неаутентифицирован", 403). Но в то же время я хочу продолжать перенаправлять неаутентифицированных пользователей на страницу входа в систему для моих веб-пользователей.

Итак, я хочу добиться:

  • Когда неаутентифицированные веб-пользователи пытаются просмотреть: domain.com/settings, он будет перенаправлен на страницу domain.com/login.

  • Когда запрос приходит на domain.com/api/settings, если в запросах нет токена Bearer или неверный токен Bearer, ответ будет json.

2 ответа

Решение

Я бы сказал, что самое чистое решение - отправить запрос от вашего React Native как ("application/json"). В этом случае Laravel определит, что это вызов API, и не будет перенаправлять наroute("login")

Вот отрывок из App\Http\Middleware\Authenticate:

/**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }

Решение:

Новый маршрут в api.php:

Route::get("/unauthenticated", function(Request $request) {
    return response("Unauthenticated", 403);
})->name("unauthenticated");

Отредактируйте в промежуточном программном обеспечении Authenticate.php:

    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            if($request->is("api/*")) {
                return route("unauthenticated");
            }
            return route('login');
        }
    }
Другие вопросы по тегам