2016-08-10 35 views
0

В приложении, которое смешивает Laravel и Angular, у меня есть эта постоянная ошибка CSRF token mismatch при вызове маршрута с углового сервиса. Это более или менее, как это установить:Несовпадение токенов CSRF в Laravel/Angular app

МАРШРУТЫ

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', 'Control[email protected]'); 
    }); 
}); 

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> 

От Угловая, услуга производит запрос на doc/open маршрут через $http.post который возвращает token mismatch error.

Я проверил заголовки, и $http.post действительно отправил значение для X-XSRF-TOKEN. Однако это значение заголовка не соответствует значению XSRF-TOKEN в файле cookie. Если это несоответствие, почему это происходит?

+0

Вам не нужно настраивать для углового, потому что он уже отправляет x-xsrf, который получен из Laravel - https://laravel.com/docs/5.2/routing#csrf-x-xsrf-token – naneri

+0

@naneri спасибо. но если я удалю его, я все равно получаю ошибку. – greener

+0

Можете ли вы проверить инструменты dev, чтобы угловые посылать любые заголовки во время звонков AJAX? Кстати, какие версии Angular вы используете? – naneri

ответ

0

В laravel 5.3 это сделано с пакетом Passport. У меня были проблемы с запросами на угловые ресурсы. Я установил его, установив 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 будет автоматически включать X-CRSF-токен для каждого запроса, сделанного в рамках группы веб промежуточного программного обеспечения. Надеюсь это поможет.

Смежные вопросы