web-dev-qa-db-ja.com

Laravel 5.4 + Ajaxは401Unauthenticatedに等しい

_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が行うことは、jQueryUiのSortableのシリアル化を使用して取得したIDの配列を送信することです。次に、ApiControllerはそれを調べ、特定の製品のすべての画像の並べ替えを更新しました。

Laravelドキュメントに記載されているようなCSRFトークンを、メタタグにcsrf_token()を入れて、すべてのAjaxリクエストに添付することで含めました。

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

Chromeの[ネットワーク]タブでもわかるように、リクエストに2つのCookieが追加されます。

enter image description here

7
PoTTii

重要なのは、あなたが認証されていないということです。 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基本認証」の部分

3
ExCluSiv3

HomeControllerコンストラクトメソッドを見てみましょう。このような電話はありますか?

$this->middleware(['auth']);
1

私には2つの解決策があります:

  1. 認証ミドルウェアを使用せずにコントローラーを作成します:$this->middleware(['auth']);

  2. Route::group(['middleware' => 'auth']ファイルのroutes/web.phpの前にルートを作成します。

enter image description here