2017-04-07 111 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