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' => '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->middleware(['auth']);
在routes/web.php
文件中的Route::group(['middleware' => '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 未经身份验证的主要内容,如果未能解决你的问题,请参考以下文章