2017-06-06 171 views
0

我正在發送一個ajax post請求,並且通過爲Laravel創建post路徑來完成此操作。我已經設置好了,因此每個使用ajaxSetup的ajax請求都會在自動標題中放置一個csrf標記。我試圖在後端捕獲該頭並驗證令牌是否匹配。Laravel 5.4 null csrf_token()發佈到路由

在我的網絡的路由(自動使用Web中間件),這將返回預期:

Route::get('/test', function() { 
    return csrf_token(); 
}); 

然而,當我發佈到通過AJAX的路線,像任一下面的方法:

嘗試1:

Route::post('/test', '[email protected]'); 

在AjaxController構造,接着警報在視圖中:

var_dump(csrf_token().',hi'); die; 

迴應:',嗨'(csrf_token爲空)。

嘗試2:

Route::post('/test', ['test' => csrf_token().',hi', 'uses' => '[email protected]']); 

$test = $request->route()->getAction()['test']; 
var_dump($test); die; 

響應: '在'(csrf_token爲空)。

我似乎碰到的是,在請求csrf_token()被填充的情況下,在我的post請求中,它不是。

任何想法?

+0

不確定如果你知道這一點,但在'app.js'和/或'layouts/app.blade.php'文件中應該有一個JS腳本,它將csrf_token添加到你的api請求標題中。如果沒有,我會調查,以確保它。避免需要檢索它,因爲你有效地做的是請求一個csrf並同時清除一個,因此csrf是無效的。如果有任何意義... – sourRaspberri

+0

我已經更新我的問題更具體 –

回答

0

終於明白了這一點。

確實可以在ajax發佈請求上檢查CSRF。我想確保他們自己網站上的某個人沒有成功做任何事情,特別是對於其他用戶,我的ajax終端沒有成功。

但是,我遇到了Laravel操作問題順序,Laravel設置了會話。我試圖在構造函數中調用一個驗證方法(在同一個類中),我在那裏驗證了CSRF並在一個地方驗證了請求用戶。我希望這樣做,以便任何時候有人打這個班,我不必在班上的每個公開方法中調用驗證,我只需要調用一次。

但是,csrf_token()和通常的請求會話在我的結構中還不適用於我。但是,我可以在路由中調用的控制器類中的方法中使用它。

例如,給出以下路線:

Route::post('/test', '[email protected]'); 

如果我注射請求到結構,然後試圖引用會話東西(在構造),或獲得csrf_token的值()它會拋出一個錯誤,因爲Laravel還沒有設置這些東西。但是如果我在測試方法中引用其中的任何一種,它就會在那裏並且可以很好地使用。

有點奇怪的Laravel操作順序問題。

0

csrf保護由Laravel Forms管理。處理API時不可用。

你應該看看中間件是如何在Laravel 使用https://laravel.com/docs/5.4/middleware

想到用你的API的API中間件;)

+0

我沒有在我原來的帖子(現在編輯)提到該職位是ajax請求,所以csrf令牌放入標題在ajaxSetup中,然後在服務器端驗證它。我一直在讀的東西似乎告訴我,我應該能夠將它放在標題中,然後在後端進行驗證。 –

0

檢查你的路線組必須應用web中間件作爲

Route::group(['middleware' => 'web'], function() { 
    Route::get('/test', function() { 
     return csrf_token(); 
     //or return $request->session()->token(); 
    }); 
}); 
+0

從特定版本(5.2.something)開始,現在自動完成。 –

0

如果你運行這個命令php artisan make:auth這裏記錄https://laravel.com/docs/5.4/authentication#authentication-quickstart當你去resources/views/layouts/app.blade.php你會看到這個:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

而且在app.js

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

在5.3有這個實用的功能,看起來好像已經被5.4去除。

<script> 
    window.Laravel = <?php echo json_encode([ 
     'csrfToken' => csrf_token(), 
    ]); ?> 
</script> 

所以你需要做的是將csrf字段添加到每個請求。做前2個代碼片段,你會沒事的。我相信第三個可能是Vue。

回答你的問題:不,不,不,不。 CSRF令牌我不相信會在POST請求中生成,它是一個跨站點引用令牌,而不是身份驗證令牌。如果你正在尋找認證令牌刷新之類的東西,然後結賬智威湯遜,儘管目前還沒有完成JWT for laravel的軟件包;有一點工作,你可以讓他們工作。

https://github.com/tymondesigns/jwt-auth 1.0.*@dev很不錯。然後你可以使用它們的刷新中間件來根據請求產生新的令牌,但是這是相當先進的,除非它用於認證,否則我不會真的打擾。

我認爲巴丁格(另一個正在進行的工作,我相信)https://github.com/dingo/api使用上述包裝

還有什麼讓我知道!