2017-04-07 108 views
1

我构建了一个新的laravel 5.4项目。Laravel 5.4 Api Route 401

我试图在我的api路径中执行以下步骤,但不知何故,它们不起作用。

在我app.js文件,我有这样的Ajax调用:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), 
    } 
}); 
$.ajax({ 
    url: 'api/postStream', 
    type: 'post', 
    data: { imgData: imgData }, 
    success:function(data) { 
     console.log('success'); 
    } 
}); 

我的API路线是这样的:

Route::group(['middleware' => 'auth:api'], function() 
{ 
    Route::post('postStream', ['as' => 'image', 'uses' => '[email protected]']); 
}); 

而且我的控制器:

public function postStream(Request $request) 
{ 
    $imgData = $request->imgData; 
    ... 
} 

但我在我的chrome dev控制台中得到这个错误:

POST http://localhost/app/public/api/postStream 401 (Unauthorized) 

和网络工具这样的:

{error: "Unauthenticated."} 
error 
: 
"Unauthenticated." 

我想我有点不authentificated,但我不知道如何做到这一点这种方式。

+0

这能帮助你吗? https://laracasts.com/discuss/channels/laravel/many-time-401-unauthorized-on-ajax-requests – Cr1xus

+1

你确定你打的是正确的端点吗?我的猜测是http请求应该去http:// localhost/api/postStream。 – Unex

+0

如果您使用'['middleware'=>'auth:api']',则需要传递访问令牌。遵循创建API,保护API和请求API密钥的步骤。首先你需要获得访问密钥,并通过ajax调用。我使用'Passport'为我的API提供身份验证。 https://laravel.com/docs/5.4/passport – webDev

回答

0

路由中间件auth:api检查对该路由的呼叫(AJAX)是否被授权。您正在进行ajax调用,但不传递访问令牌,这就是为什么401错误消息。

如果您使用应用程序中的那些REST端点,那么我会建议您使用正常的auth路由中间件创建REST端点,并将所有这些路由放入web.php路由文件中。 (如果你做的内部AJAX调用)

现在,您问题(错误消息)的快速解决方案,删除此

Route::group(['middleware' => 'auth:api'], function() 
{ 
    Route::post('postStream', ['as' => 'image', 'uses' => '[email protected]']); 
}); 

,并把刚才的路线在api.php没有任何中间件(AUTH :api)

Route::post('postStream', ['as' => 'image', 'uses' => '[email protected]']); 

这意味着您已将您的安全性从您的API REST端点中移除。只要把路由不认证中间件auth:api,它不会给你错误消息。

但这不是个好主意,它只是快速的错误解决方案。如果您想编写一些公共REST端点,则必须使这些端点安全并使用路由中间件作为auth:api

见护照Link

基本上你要明白,你有什么要求
1)如果仅用于内部AJAX API调用 - 然后把这些航线web.php下AUTH中间件。
2)如果您需要将这些REST API公布到世界各地,请将其写入api.php,并使用Passport进行安全保护。

2

它不起作用,因为您的路线受auth:api保护,它返回401 unauthorized。经过auth:api的唯一方法是与每一个请求

var token = <?php json_encode(Auth::user()->api_token); ?>; //if you are using api_token 

$.ajax({ 
    url: 'api/postStream', 
    headers: { 
     'Authorization':'Bearer ' + token, 
    }, 
    type: 'post', 
    ... 
}); 

您得到您的令牌是完全取决于你自己的方式发送给您的身份验证令牌。您可以使用Passport或者简单地将api_token添加到用户表的最简单的解决方案。

如果你要最便宜的解决方案,你可以按照这个帖子:https://gistlog.co/JacobBennett/090369fbab0b31130b51

+0

嗨,我离开了几天,不能回应你,所以我建立以下https://kopy.io/WIZp1 ajax头看起来有多兴奋?我没有拿到'持票人'的东西 – utdev

+0

你需要一个API来授权。我给了你一个链接,看看如何添加api_token给你的用户。因为你需要它进行身份验证。 – EddyTheDove