Как вернуть массив, если запрос не прошел промежуточное ПО в Laravel? - PullRequest
0 голосов
/ 17 января 2020

Я использую Laravel для бэкэнда и AngularJS для обработки внешнего интерфейса. Проблема заключается в angularjs вызове ajax в контроллер для получения данных, в противном случае в промежуточном программном обеспечении auth я хочу добавить еще 1 промежуточное программное обеспечение, называемое apiKeyAuth, чтобы проверить, отправляет ли запрос конечного пользователя действительный ключ API. , Но после того, как я проверил условие внутри apiKeyAuth, оно выдаёт мне ошибку в \Http\Middleware\VerifyCsrfToken.php. Тип возвращаемого значения недействительного ключа API - это массив. Ниже приведен мой код.

* Промежуточное ПО APIKeyAuth:

class APIKeyAuth
{
    public function handle($request, Closure $next)
    {
        if ($request->get('api_key') != 'MyAPIKey'){
            return ['status' => 401, 'message' => 'Invalid API Key.', 'data' => null];
        }
        return $next($request);
    }
}

Ответы [ 2 ]

1 голос
/ 17 января 2020

Промежуточное ПО VerifyCsrfToken проверяет действительный токен csrf. Он запускается до ваших пользовательских промежуточных программ.

По умолчанию ваши запросы ajax не включают токен csrf.

Если вы делаете запросы от своего веб-интерфейса, просто добавьте токен csrf в свои запросы. Например, Ax ios:

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

Если вы хотите получить доступ к своему API-интерфейсу вне внешнего интерфейса, рассмотрите возможность перемещения ваших маршрутов API в выделенный файл routes/api.php или отключение защиты csrf на следующих маршрутах: Документы

namespace App\Http\Middleware;

class VerifyCsrfToken extends Middleware
{
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

Кроме того, как предложил @ matei-mihai, используйте JsonResponse для возврата массива

1 голос
/ 17 января 2020

Вы должны вернуть JsonResponse вместо массива:

class APIKeyAuth
{
    public function handle($request, Closure $next)
    {
        if ($request->get('api_key') != 'MyAPIKey'){
            return Illuminate\Http\JsonResponse::create(
                ['message' => 'Invalid API Key.'],
                Illuminate\Http\JsonResponse::HTTP_UNAUTHORIZED
            );
        }
        return $next($request);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...