2016-08-10 107 views
0

在Laravel和Angular混合的應用程序中,當從Angular服務調用路由時,出現此持久性CSRF token mismatch錯誤。Laravel/Angular應用程序中的CSRF令牌不匹配

ROUTES

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', '[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> 

,服務被生產超過$http.postdoc/open路線的請求,其返回token mismatch error

我檢查了標題,並且$http.post確實發送了一個值X-XSRF-TOKEN。但是,此標頭值與Cookie中的XSRF-TOKEN值不匹配。如果這是不匹配的,爲什麼會發生?

+0

您不需要設置角度,因爲它已經發送了從Laravel接收的x-xsrf - https://laravel.com/docs/5.2/routing#csrf-x-xsrf-token – naneri

+0

@naneri謝謝。但如果我刪除它,我仍然會得到錯誤。 – greener

+0

你可以在開發工具中檢查AJAX調用期間角度發送任何標題嗎?順便說一下你使用哪個版本的Angular? – naneri

回答

0

在laravel 5.3中,通過Passport包可以簡化操作。我在Angular資源請求方面遇到同樣的問題。我固定它通過經由安裝作曲家護照和添加下列行來

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-TOKEN針對網絡中間件組內的每個請求。希望這可以幫助。