2015-08-20 14 views
7

Ich baue eine REST-API Laravel 5.1 und ich erhalte diese Störung:TokenMismatchException in VerifyCsrfToken - Laravel 5.1

TokenMismatchException in VerifyCsrfToken.php line 53: 

Hier ist meine routes.php:

Route::controller('city' , 'CityController'); 

CityController:

class CityController extends Controller 
{ 
    public function postLocalities() 
    { 
    $city = Input::get('cityName'); 
    $response = $city; 
    return $response; 
    } 
} 

Hier ist die Stacktrace des Fehlers, wenn ich die URL http://localhost:8000/city/localities?cityName=bangalore mit POST-Methode traf.

TokenMismatchException in VerifyCsrfToken.php line 53: 

in VerifyCsrfToken.php line 53 
at VerifyCsrfToken->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), 
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in  
ShareErrorsFromSession.php line 54 
at ShareErrorsFromSession->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'),  
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in  
StartSession.php line 62 
at StartSession->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(StartSession), 'handle'), 
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in 
AddQueuedCookiesToResponse.php line 37 
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'),  
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in  EncryptCookies.php line 59 
at EncryptCookies->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(EncryptCookies), 'handle'),  
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in  
CheckForMaintenanceMode.php line 42 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), 
array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103 
at Pipeline->then(object(Closure)) in Kernel.php line 122 
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87 
at Kernel->handle(object(Request)) in index.php line 54 
at require_once('C:\Users\betaworks02\Documents\gharbhezoBackend\public\index.php') in server.php line 21 
+1

Können Sie uns Ihr HTML-Formular zeigen? – mdamia

+0

Ich habe kein HTML-Formular verwendet, da ich REST-APIs für mobile Apps erstelle. Ich erhalte die Anfragen über die Anwendung. – Chandz

+1

@Twreck hat die Lösung veröffentlicht. das sollte es. – mdamia

Antwort

11

Wenn Sie eine API seine besten bauen die CRSF Middleware auf Basis pro Strecke zu platzieren, anstatt es als eine globale Middleware setzt. Um es als eine Route Middleware zu machen gehen Sie auf die Datei "/app/Http/Kernel.php".

/** 
* The application's global HTTP middleware stack. 
* 
* @var array 
*/ 
protected $middleware = [ 
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
    'Illuminate\Cookie\Middleware\EncryptCookies', 
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
    'Illuminate\Session\Middleware\StartSession', 
    'Illuminate\View\Middleware\ShareErrorsFromSession', 
    //comment out to avoid CSRF Token mismatch error 
    // 'App\Http\Middleware\VerifyCsrfToken', 
]; 

/** 
* The application's route middleware. 
* 
* @var array 
*/ 
protected $routeMiddleware = [ 
    'auth' => 'App\Http\Middleware\Authenticate', 
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', 
    'cors' => 'App\Http\Middleware\CorsMiddleware', 
    'api' => 'App\Http\Middleware\ApiMiddleware', 
    'csrf' => 'App\Http\Middleware\VerifyCsrfToken'// add it as a middleware route 

Jetzt können Sie es auf den Strecken setzen, wo Sie es zum Beispiel benötigen

Strecke :: get ('someRoute', array ('Anwendungen' => 'Homecontroller @ getSomeRoute', 'Middleware' => 'csrf'));

Für Ihren Fall, in dem Sie kein CSRF-Token-Matching benötigen, sollte es jetzt gut funktionieren.

+0

Ultimate! Das funktioniert jetzt super. Ich suchte viel nach der richtigen Lösung, aber jeder hatte im Zusammenhang mit HTML-Formularen gelöst. Du hast mir die richtige Antwort gegeben. Vielen Dank :) – Chandz

+1

froh, dass es geklappt hat;) –

+1

Danke Tariq Khan.Ist auch für mich arbeiten – Amesh

14

Sie müssen das CFSR-Token in Ihrer App nicht vollständig überschreiben. In Ihrer App/Http/Midlleware Ordner VerifyCsrfToken.php gehen und geben Sie Ihre API Route Ausnahme wie folgt:

/** 
* The URIs that should be excluded from CSRF verification. 
* 
* @var array 
*/ 
protected $except = [ 
    'api/*', 
]; 

Der * zeigt für alle Routen in Ihrem API.

+0

Diese Antwort erwies sich als sicherer. –

+0

Der beste und einfachste Weg –

0

Ich bekam den gleichen Fehler, aber mit allen Warnungen über das Überschreiben der CSRF-Validierung wollte ich diese Einstellungen nicht ändern.

Ich fand schließlich, dass mein Sitzungstreiber in /config/session.php standardmäßig zu memcached war, und da ich auf einem Entwicklungsserver war, musste ich die SESSION_DRIVER-Umgebungsvariable mit 'Datei' überschreiben, um die Sitzung in/Speicher zu verwenden/Rahmen/Sitzungen.

/.env 

SESSION_DRIVER = file