Laravel 5.4 + Ajax равно 401 без аутентификации

Всякий раз, когда я пытаюсь назначить маршрут из моего api.php файла, я получаю 401: Unauthenticated-ошибку.

Это маршрут:

Route::group(['prefix' => 'v1', 'middleware' => 'auth:api'], function () {
    Route::post('admin/product-image-sort', 'ApiController@SaveProductImageSort')->name('api.save-product-image-sort');
});

Я вызываю это с помощью Jquery Ajax:

<script>

        $('#sortable-image-container').sortable({
            items: '> .row > *',
            update: function (event, ui) {
                var data = $(this).sortable('serialize');
                console.log(data);
                $.ajax({
                    data: data,
                    type: 'POST',
                    url: "{{ route('api.save-product-image-sort') }}",
                    success: function (data) {
                        if(data == "success"){
                            $.notify({
                                icon: 'pe-7s-close-circle',
                                message: "Sucessfully saved the Image Sorting"
                            },{
                                type: 'success',
                                timer: 500
                            });
                        }
                    }
                });
            }
        });
    </script>

Так что это работает безупречно при исключении части 'middleware' => 'auth:api', но я не хочу просто разрешать доступ к моему внутреннему API без какой-либо формы аутентификации.

Что делает API, так это отправляет массив идентификаторов, которые он получил, используя сериализацию Sortable jQuery Ui. Затем ApiController просматривает это и обновляет сортировку каждого изображения определенного продукта.

Я включил токен CSRF, как указано в документах Laravel, поместив csrf_token() в метатег и прикрепив его к каждому запросу Ajax:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
}); 

Как я также вижу на вкладке сети Chrome, он добавляет к запросу два файла cookie.

введите описание изображения здесь


person Community    schedule 20.03.2017    source источник
comment
привет ты уже нашел решение?   -  person utdev    schedule 06.04.2017
comment
@utdev К сожалению, нет. Вы сделали тем временем? Заранее спасибо.   -  person    schedule 19.04.2017
comment
Либо предоставить данные аутентификации (токен), либо удалить промежуточное ПО?   -  person Martin Bean    schedule 19.04.2017
comment
Я, возможно, нашел решение сегодня, но в настоящее время я не на своей машине разработки, поэтому я могу ответить завтра (или, по крайней мере, дать несколько советов)   -  person utdev    schedule 19.04.2017
comment
возможно, вам просто нужно auth промежуточное ПО для веб-аутентификации вместо auth:api, которое используется для общедоступного API, которому требуется токен аутентификации.   -  person Bagaskara Wisnu Gunawan    schedule 26.04.2017
comment
если вы используете laravel/passport, вы можете использовать свой собственный API. [документация паспорта laravel]laravel.com/docs/5.4/ в этом случае временный токен доступа создается при каждой успешной проверке сеанса, которая аутентифицирует вызовы API.   -  person Ashutosh Raj    schedule 26.04.2017
comment
В противном случае вам необходимо передать токен доступа, а затем включить его в вызов API для аутентификации. В качестве альтернативы вы не используете вызовы API и создаете маршруты в веб-маршрутизаторе и используете auth: web в качестве маршрута аутентификации, который будет зависеть от сеансов и не будет вызовами API без сеанса.   -  person Ashutosh Raj    schedule 26.04.2017


Ответы (3)


Дело в том, что вы не авторизованы. Токен CSRF не является токеном аутентификации.

Вам понадобится способ аутентификации ваших пользователей по API и (например) предоставить им уникальный токен аутентификации, который они отправляют с каждым запросом, чтобы убедиться, что им разрешено использовать ваш API.

Возможно, эта ссылка может быть полезной:

https://laracasts.com/discuss/channels/laravel/53-api-routes-auth-middleware-confusion

Эта часть документации тоже может быть полезна. Речь идет о базовой аутентификации HTTP:

https://laravel.com/docs/5.4/authentication#http-basic-authentication

Особенно часть «Базовая HTTP-аутентификация без сохранения состояния»

person ExCluSiv3    schedule 19.04.2017

Давайте взглянем на метод построения HomeController. Есть ли вызов, который выглядит примерно так?

$this->middleware(['auth']);
person Dharmesh Rakholia    schedule 23.05.2018
comment
Да, у меня есть промежуточное ПО для этого маршрута. - person Gjaa; 17.10.2019

У меня есть два решения:

  1. Создайте контроллер без использования промежуточного программного обеспечения аутентификации: $this->middleware(['auth']);

  2. Создание маршрута до Route::group(['middleware' => 'auth'] в файле routes/web.php.

введите здесь описание изображения

person Csar Jefferson Aquino Maximili    schedule 18.03.2020