Laravel / Angular应用程序中的CSRF令牌不匹配

时间:2016-08-10 17:35:00

标签: angularjs laravel laravel-5.2 csrf

在混合了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 ,服务正在通过doc/open $http.post路由生成请求,该请求返回token mismatch error

我检查了标头,$http.post确实发送了X-XSRF-TOKEN的值。但是,此标头值与Cookie中的XSRF-TOKEN值不匹配。如果不匹配,为什么会发生?

1 个答案:

答案 0 :(得分:1)

在laravel 5.3中,使用Passport包可以简化这一过程。我对Angular资源请求遇到了同样的麻烦。我通过组合器安装Passport并将以下行添加到

来修复它
app\Http\Kernel.php
 protected $middlewareGroups = [
    'web' => [
        \stix\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \stix\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
    ],

现在,laravel将自动为Web中间件组中的每个请求包含X-CRSF-TOKEN。希望这会有所帮助。