【发布时间】:2016-12-17 05:29:11
【问题描述】:
在一个混合了 Laravel 和 Angular 的应用程序中,我在从 Angular 服务调用路由时出现了这个持续的CSRF token mismatch 错误。这或多或少是这样设置的:
路线
Route::group(['middleware' => ['web'] ], function () {
// non-auth routes (e.g. signup, login) ...
Route::group(['middleware' => 'auth'], function() {
Route::get('w/{ignore?}', function () { return view('writer.index');})
->where('ignore', '.*');
Route::match(['get', 'post'], 'doc/open', 'Controller@openItem');
});
});
writer.index 视图显示良好,没有令牌错误(用户已通过身份验证)。
VIEW包括:
<meta name="csrf-token" content="{{ csrf_token() }}" />
和
<script>
$(function(){
$.ajaxPrefilter(function(options, originalOptions, xhr) {
var token = $('meta[name="csrf-token"]').attr('content');
if (token) {
return xhr.setRequestHeader('X-CSRF-TOKEN', token);
}
});
});
</script>
从 Angular,服务正在通过 $http.post 向 doc/open 路由生成请求,该路由返回 token mismatch error。
我检查了标题,$http.post 实际上确实发送了X-XSRF-TOKEN 的值。但是,此标头值与 cookie 中的 XSRF-TOKEN 值不匹配。如果这是不匹配,为什么会发生?
【问题讨论】:
-
你不需要设置 Angular,因为它已经发送了从 Laravel 收到的 x-xsrf - laravel.com/docs/5.2/routing#csrf-x-xsrf-token
-
@naneri 谢谢。但如果我删除它,我仍然会收到错误消息。
-
您能否在开发工具中检查 Angular 在 AJAX 调用期间是否发送任何标头?顺便问一下,您使用的是哪个版本的 Angular?
-
@naneri Angular v1.2.12,它正在发送 X-XSRF-TOKEN 和 cookie(包括 XRSF-TOKEN,与 X-XSRF-TOKEN 不同)
-
你在使用路由组吗?
标签: angularjs laravel laravel-5.2 csrf