2014-12-04 104 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