Laravel 7: Как предотвратить перенаправление проверки подлинности промежуточного программного обеспечения, когда пользователь не прошел проверку подлинности? - PullRequest
1 голос
/ 28 мая 2020

Я реализовал аутентификацию промежуточного ПО с помощью $this->middleware('auth:api');.

Приложение представляет собой REST API, поэтому мне не нужно Laravel для перенаправления клиента. Мне нужно, чтобы он возвращал ответ JSON.

Внутри App\Http\Middleware\Authenticate.php; есть метод redirectTo. Этот метод принимает только маршрут, поэтому я не могу добавить к этому методу ответ JSON.

Как я могу использовать промежуточное ПО Authenticate (auth:api) и возвращать JSON ответ, когда пользователь не аутентифицирован?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Laravel уже делает это, когда запрос ожидает ответа JSON. Итак, пока вы либо отправляете запросы AJAX, либо отправляете запросы с правильно установленным заголовком Accept (application/json или *), Laravel автоматически отвечает 401 JSON ответ.

0 голосов
/ 28 мая 2020
<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * 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');
        }
    }
}

Этот класс расширяет Illuminate\Auth\Middleware\Authenticate - и отменяет метод redirectTo. Вам нужно записать свой собственный метод ручки. Если вы хотите, вы можете удалить часть extends, если вам не нужен метод аутентификации фреймворка.

public function handle($request, Closure $next, ...$guards)
{
    if (Auth::guest()) {
        return response()->json(['message' => 'you shall not pass']);
    }

    // other checks

    return $next($request);
}

Другой вариант - сохранить extends и вызвать родительский метод после регулярных проверок, если вам нужны некоторые функции из базового класса.

public function handle($request, Closure $next, ...$guards)
{
    if (Auth::guest()) {
        return response()->json(['message' => 'you shall not pass']);
    }

    return parent::handle($request, $next, $guards);
}
...