2016-04-28 4 views
1

Ich habe eine Laravel 5.1-Anwendung mit Ajax-Inhalt beim Start geladen.CSRF-Token funktioniert nicht in Laravel 5.1 Ausnahmen Handler mit einer Ajax-Anfrage

ich die CSRF-Meta-Tag auf Seite Kopf gesetzt haben:

<meta name="csrf-token" content="{{ csrf_token() }}" /> 

Und ich benutze es in Jquery AJAX-Anfragen:

Alles funktioniert perfekt unter normalen Umständen. Aber wenn ich öffnen Sie eine 404-Fehlerseite ohne vorherige Sitzung, erhalten meine AJAX-Anfragen einen Fehler: TokenMismatchException in VerifyCsrfToken.php

Ich habe einen 404-Fehler-Handler in der Datei: app \ Ausnahmen \ handler.php

public function render($request, Exception $e) 
{ 
    if ($e instanceof NotFoundHttpException) 
    { 
    $foo = \App\Foo::foo(); 
    return \Response::make(view("errors.404", compact("foo")), 404); 
    } 

    return parent::render($request, $e); 
} 

Ich kann diesen Fehler wiederholen, indem ich ein privates Browserfenster öffne und meine Site mit einer URL zu einer nicht existierenden Seite öffne. Es bleibt beim erneuten Laden der Seite bestehen. Aber wenn ich auf eine bestehende Seite gehe und die 404-URL erneut ausprobiere, funktioniert es gut.

Irgendwelche Ideen, wie dieses Problem behoben wird?

EDIT:

Ich habe versucht, mehr Ajax-Anfragen zu überprüfen und es scheint, als ob jede Anforderung eine complitely andere Sitzung mit verschiedenen Token hat:

$request->session()->token(); 

Antwort

0

In Ihrer CSRF-Middleware diesen Elternteil vor der Rückkehr hinzufügen :: Griff ($ request, $ next):

if($request->ajax()) 
{ 
    \Input::merge([ 
     '_token' => $request->header('X-CSRF-Token') 
    ]); 
} 

Edit: Ist csrf_token() zurückkehrt, alles auf dieser Seite 404? Ich fand etwas Interessantes here. Sieht ähnlich wie Ihr Problem aus

+0

Kein Glück. Die Funktion Middleware \ VerifyCsrfToken.php tokensMatch ruft das Token bereits ab: $ token = $ request-> input ('_ token')?: $ Request-> header ('X-CSRF-TOKEN'); – Corrodian

+0

Ja, csrf_token() gibt einen Wert zurück. Ich könnte den Benutzer auf eine separate 404 URL umleiten und damit das Problem vermeiden. Dann würde der Benutzer jedoch die ursprüngliche URL verlieren. Es scheint merkwürdig, dass ich das tun müsste. – Corrodian

Verwandte Themen