正确设置 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令牌不匹配错误?

Laravel 7 Vue 2 Sanctum 登录错误 419; CSRF 令牌不匹配

执行 POST 时,CSRF 令牌在标头中传递