【问题标题】:CSRF token mismatch in Laravel / Angular appLaravel / Angular 应用程序中的 CSRF 令牌不匹配
【发布时间】: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.postdoc/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


【解决方案1】:

在 laravel 5.3 中,这通过 Passport 包变得简单。我在使用 Angular 资源请求时遇到了同样的问题。我通过 composer 安装 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。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 2020-07-18
    • 1970-01-01
    • 2020-07-08
    • 2016-12-10
    • 2016-09-20
    • 2020-01-20
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多