正确设置 Laravel 5 CSRF 令牌的标头
Posted
技术标签:
【中文标题】正确设置 Laravel 5 CSRF 令牌的标头【英文标题】:Correctly set headers for Laravel 5 CSRF Token 【发布时间】:2015-02-02 22:11:54 【问题描述】:好的,已经搜索了几个小时,但找不到解决方案的开始。
我正在使用带有 laravel 后端的 angularJS 前端。 Restangular 是我的通讯服务。
我的 POST 很好,因为我可以在数据中包含 _token 并且它会起作用。
但是对于 Restangular 调用破坏函数,它看起来像......
Restangular.all('auth/logout').remove(); //maps to AuthController@Destroy
一切都好,但是你会得到一个 TOKENMISMATCH 异常,这是一个很好的安全问题
由于我找不到将 _token 包含到删除中的方法,因为它本质上是无正文的,所以我决定将令牌放在标题中。
RestangularProvider.setDefaultHeaders('X-XSRF-TOKEN': CSRF_TOKEN); //CSRF_TOKEN gathered elsewhere
在 Chrome dev tolos 中,我可以看到标题设置为
X-XSRF-TOKEN:ClkQIRLpFQgMg8ZT6X5CF6doCplRfdJzW8msx2JI
X-XSRF-TOKEN 正是VerifyCrsfToken.php 正在寻找的。然而,它吐出一个解密错误。任何其他令牌名称,例如 XSRF-TOKEN、_TOKEN、CSRF_TOKEN 都会吐出令牌不匹配。
由于最后一个事实,似乎标头已正确声明,但我无法理解的某些事情导致 Laravel 解密失败。而且我已经密切关注解密功能,但不明白为什么它会失败......
感谢您的帮助。
【问题讨论】:
你试过'X-CSRF-TOKEN': CSRF_TOKEN
吗?
【参考方案1】:
对于 Laravel 5,不需要将 CSRF 令牌添加到 Angular http 标头。
带有 Angular 的 Laravel 5 会自动为您完成这项工作。
http://laravel.com/docs/5.1/routing#csrf-x-xsrf-token
【讨论】:
【参考方案2】:这是由于 csrf 令牌的加密。 Laravel 期望令牌被加密。
它尝试解密您提供的纯令牌,但失败了。
在您可以在标头中使用令牌之前,您必须对其进行加密。
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
这对我有用。
亚历克斯
【讨论】:
我最终尝试了这个,但由于我的角度应用程序有一定程度的分离,我不知道如何准确加密它。后来我发现,由于 Laravel 5 仍在生产中,创建者在 verifycsrf.php 中添加了一个有用的行,使令牌在 cookie 中可用。这真的帮了大忙! github.com/laravel/framework/commit/… @csduarte 关于在请求生命周期中设置的 XSRF-TOKEN cookie 是正确的。通过更新我的 VerifyCsrfToken.php 中间件来检查$request->cookie('XSRF-TOKEN')
是否已设置,我终于让我的所有 AJAX 完全正常工作(由于各种原因没有在表单上设置 _token)。
@dcarrith 您能否分享一下您的 VerifyCsrfToken 中间件如何工作的代码?真的很有用!如果我理解正确,通过这样做,不需要手动设置 angular 的令牌头,因为它是自动完成的。
这里“$encrypter = app('Illuminate\Encryption\Encrypter'); $encrypted_token = $encrypter->encrypt(csrf_token());”应该放还是应用?以上是关于正确设置 Laravel 5 CSRF 令牌的标头的主要内容,如果未能解决你的问题,请参考以下文章
在标头中发送令牌时,Laravel TokenMismatch Exception
Laravel + Vue.js (axios) - CSRF 令牌不匹配
如何在 Dropzone 上传请求的标头中包含 CSRF 令牌?
laravel 5中多个异步ajax请求中的CSRF令牌不匹配错误?