2016-09-21 38 views
0

局勢:Laravel5:TokenMismatchException在compiled.php線3123:

對不起提前如果它已經被問。但是無論如何我永遠無法做到這一點。

我使用Laravel 5作爲API。

我有一個簡單的功能來編輯任務。

我正在通過我的網絡應用程序或郵遞員測試它。

我總是收到此錯誤:

TokenMismatchException in compiled.php line 3123: 

TokenMismatchException

的代碼:

功能:

public function updateTask(Request $request) 
{ 
    $id = $request->input('id'); 

    $task = Task::find($id); 
    $task->name = $request->input('name'); 
    $task->type = $request->input('type'); 
    $task->save(); 

    return $task; 
} 

路線:

Route::group(['middleware' => ['web']], function() { 

    Route::post('update', '[email protected]'); 
}); 

問題:

爲什麼我收到這個錯誤?

回答

0

我解決它通過將路由名稱作爲數組$項目除了在文件中:

app/http/Middleware/VerifyCsrfToken.php 

像這樣:

/** 
* The URIs that should be excluded from CSRF verification. 
* 
* @var array 
*/ 
protected $except = [ 

    'update' 
]; 
2

嘗試在表單中添加此:

<input type="hidden" name="_token" value="{{ csrf_token() }}"> 
+0

感謝您的答覆。但我正在使用Laravel作爲API ..我的表單是有角度的..所以我不知道從哪裏得到csrf_token().. – johnnyfittizio

1

它從你的web應用程序,因爲你的web應用程序是經過標記的工作方式。

您需要打開app/Http/Kernel.php並註釋掉\App\Http\Middleware\VerifyCsrfToken::class,。但是,這會使您的站點容易受到CSRF攻擊,因此您還應該找到另一種保護站點的方法。

我的建議是保留CSRF中間件並創建一個新的路由組,其中包含web中間件組之外的所選前綴(通常類似api/v1/)。這些路線將不會受到CSRF的保護,因此您應該找到另一種方式來保護它們。我最近在與jwt-auth完全相同的情況下取得了很大的成功。 https://github.com/tymondesigns/jwt-auth

當然,如果你的前端沒有完全與你的後端解耦,並且Laravel正在輸出初始頁面,然後後來由角度控制,你可以將CSRF標記放入元標記中,並將其傳遞給標題X-CSRF-TOKEN,然後Laravel將其提取出來。

+0

但是我的路由(嘗試1)應該不工作?是否在中間件之外,因此控制令牌不是?但它不起作用 – johnnyfittizio

+0

您的路由是否在路由組內並且該路由組是否具有「網絡」中間件? – user3158900

+0

我嘗試所有可能性:1在中間件外部。 2與網絡中間件。 3與api中間件。但從來沒有工作.. – johnnyfittizio

0

你需要在你的頭文件中傳遞它;

headers: { 
    'X-CSRF-TOKEN': {{ csrf_token() }} 
}, 
相關問題