2014-12-04 101 views
4

好吧,一直在搜索這個小時,並且找不到解決方案的開始。正確設置Laravel 5 CSRF令牌的標頭

我正在使用帶有laravel後端的angularJS前端。 Restangular是我的通信服務。

我的POST很好,因爲我可以在數據中包含_token,它會起作用。

但Restangular調用一個函數破壞它看起來像......

Restangular.all('auth/logout').remove(); //maps to [email protected] 

一切都很好,但你會得到一個TOKENMISMATCH異常,這是一個很好的安全messure

因爲我可以找不到將_token包含在刪除中的方法,因爲它本質上沒有實質性,所以我決定將標記放在標題中。

RestangularProvider.setDefaultHeaders({'X-XSRF-TOKEN': CSRF_TOKEN}); //CSRF_TOKEN gathered elsewhere 

出了Chrome瀏覽器開發tolos的,我可以看到標題設置爲

X-XSRF-TOKEN:ClkQIRLpFQgMg8ZT6X5CF6doCplRfdJzW8msx2JI 

X-XSRF-TOKEN正是什麼VerifyCrsfToken.php所期待的。然而,它吐出了一個解密錯誤。任何其他令牌名稱(如XSRF-TOKEN,_TOKEN,CSRF_TOKEN)都會吐出令牌不匹配。

由於這個最後一個事實,它看起來像標題被正確地聲明,但是超出我理解的東西正在導致Laravel失敗解密。我已經在密碼解密功能,但不明白爲什麼它會失敗...

謝謝你的幫助。

+0

你試過' 'X-CSRF-TOKEN':CSRF_TOKEN'? – user2094178 2015-02-25 03:19:55

回答

5

這是由於csrf令牌的加密。 Laravel期望令牌被加密。

它試圖解密您提供的簡單令牌,並且它失敗。

在標題中使用標記之前,您必須對標記進行加密。

$encrypter = app('Illuminate\Encryption\Encrypter'); 
$encrypted_token = $encrypter->encrypt(csrf_token()); 

這對我來說是訣竅。

亞歷

+2

我最終嘗試了這一點,但由於我的角度應用程序有一定程度的分離,我不知道如何精確加密它。 我後來發現,由於Laravel 5仍處於生產階段,因此創建者在verifycsrf.php中添加了一條有用的行,使cookie中的令牌可用。這真的有幫助! https://github.com/laravel/framework/commit/140d235cbb532b1ce7a80f5c2e3ddc23cf7f0c39 – csduarte 2014-12-12 16:54:16

+0

@csduarte對於在請求生命週期中也設置的XSRF-TOKEN cookie是正確的。我最後通過更新我的VerifyCsrfToken.php中間件來檢查'$ request-> cookie('XSRF-TOKEN')是否已完全工作(其中沒有_token是由於各種原因在表單上設置的)。 – dcarrith 2015-02-17 17:35:11

+0

@dcarrith你可以請你分享一下你的VerifyCsrfToken中間件的工作原理嗎?會非常有用!如果我理解正確,通過這樣做,不需要手動設置角標記標頭,因爲它是自動完成的。 – 2015-05-26 23:00:50