Laravel 5.4 + Ajax 等于 401 未经身份验证

Posted

技术标签:

【中文标题】Laravel 5.4 + Ajax 等于 401 未经身份验证【英文标题】:Laravel 5.4 + Ajax equals 401 Unauthenticated 【发布时间】:2017-08-12 05:27:54 【问题描述】:

每当我尝试从我的 api.php 文件中分配路线时,我都会收到 401: Unauthenticated-Error。

这是路线:

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' =&gt; 'auth:api' 部分时,这完美无瑕,但我不想只允许在没有任何形式的身份验证的情况下访问我的内部 api。

api 的作用是发送一个使用 jQuery Ui 的 Sortable 序列化获得的 id 数组。然后,ApiController 会遍历该内容并更新特定产品的每个图像的排序。

我通过将 csrf_token() 放入元标记并将其附加到每个 Ajax 请求中来包含 Laravel 文档中所述的 CSRF 令牌:

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

我还可以在 Chrome 的网络选项卡中看到,它向请求添加了两个 cookie。

【问题讨论】:

嗨,您找到解决方案了吗? @utdev 遗憾的是没有。期间你做了吗?提前致谢。 要么提供身份验证详细信息(令牌)或删除中间件? 我今天可能找到了解决方案,但目前我不在我的开发机器上,所以我可能会在明天回答(或至少给出一些建议) 也许您只需要一个用于 Web 身份验证的 auth 中间件,而不是用于需要身份验证令牌的公共 API 的 auth:api 【参考方案1】:

我有两个解决方案:

    不使用 auth 中间件创建控制器:$this-&gt;middleware(['auth']);

    routes/web.php 文件中的Route::group(['middleware' =&gt; 'auth'] 之前创建路由。

【讨论】:

【参考方案2】:

我们来看看 HomeController 的构造方法。有没有类似这样的调用?

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

【讨论】:

是的,我有那个路由的中间件。【参考方案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 基本身份验证”部分

【讨论】:

以上是关于Laravel 5.4 + Ajax 等于 401 未经身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4,AJAX 应该不会出错

内部服务器错误 500 Laravel 5.4 AJAX

Laravel 5.4 的 Ajax 请求

使用Laravel 5.4请求Ajax

无法使用 $request->ajax() 和 Laravel 5.4 检查请求是不是为 ajax

ajax 类型的帖子在 laravel 5.4 中不起作用