2015-08-20 17 views
7

Sto costruendo un API REST utilizzando laravel 5.1 e sto ottenendo questo errore:TokenMismatchException in VerifyCsrfToken - laravel 5.1

TokenMismatchException in VerifyCsrfToken.php line 53: 

Ecco la mia routes.php:

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

CityController:

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

Ecco lo Stacktrace dell'errore quando si preme l'URL http://localhost:8000/city/localities?cityName=bangalore con il metodo POST.

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

Puoi mostrarci il tuo modulo html? – mdamia

+0

Non ho usato alcun modulo html perché sto creando API REST per l'app mobile. Ricevo le richieste tramite l'applicazione. – Chandz

+1

@Twreck ha pubblicato la soluzione. questo dovrebbe – mdamia

risposta

11

Se si sta costruendo un'API del suo meglio per mettere la merce mezzo CRSF su ogni percorso base, piuttosto che collocarlo come un middleware globale. Per renderlo un middleware del percorso, andare al file "/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 

Ora è possibile posizionarlo sulle rotte in cui è necessario che ad esempio

percorso :: get ('someRoute', array ('usi' => 'HomeController @ getSomeRoute', 'middleware' => 'csrf'));

Per il caso in cui non è necessario abbinare token CSRF dovrebbe funzionare ora.

+0

Ultimo! Funzionando perfettamente bene ora. Ho cercato molto per la soluzione giusta ma tutti avevano risolto relativi ai moduli html. Mi hai risposto con la risposta giusta. Grazie mille :) – Chandz

+1

contento che abbia funzionato;) –

+1

Grazie Tariq Khan. Il suo lavoro è anche per me – Amesh

14

Non è necessario eseguire l'override del token CFSR dall'app. Nella cartella app/HTTP/Midlleware andare a VerifyCsrfToken.php e includere il percorso API per l'eccezione come segue:

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

Il * spettacoli per tutte le rotte all'interno del vostro API.

+0

Questa risposta si è rivelata più sicura. –

+0

Il modo migliore e più facile da fare –

0

Stavo ricevendo lo stesso errore, ma con tutti gli avvisi relativi alla sovrascrittura della convalida CSRF, non volevo modificare quelle impostazioni.

Alla fine ho scoperto che il mio Session Driver in /config/session.php era impostato su memcached e da quando ero su un server di sviluppo avevo bisogno di sovrascrivere la variabile env SESSION_DRIVER con 'file' per usare la sessione in/storage/quadro/sessioni.

/.env 

SESSION_DRIVER = file