2015-08-20 21 views
7

Tôi đang xây dựng một API REST sử dụng Laravel 5.1 và tôi nhận được lỗi này:TokenMismatchException trong VerifyCsrfToken - Laravel 5.1

TokenMismatchException in VerifyCsrfToken.php line 53: 

Đây là routes.php tôi:

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

CityController:

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

Đây là số Stacktrace lỗi khi tôi nhấn URL http://localhost:8000/city/localities?cityName=bangalore bằng phương thức 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

Bạn có thể hiển thị cho chúng tôi biểu mẫu html của mình không? – mdamia

+0

Tôi chưa sử dụng bất kỳ biểu mẫu html nào vì tôi đang xây dựng các API REST cho ứng dụng dành cho thiết bị di động. Tôi nhận được yêu cầu thông qua ứng dụng. – Chandz

+1

@Twreck đã đăng giải pháp. điều đó nên. – mdamia

Trả lời

11

Nếu bạn đang xây dựng một API tốt nhất để đặt CRSF middle ware trên cơ sở mỗi tuyến thay vì đặt nó làm phần mềm trung gian toàn cầu. Để làm cho nó như là một middleware tuyến đường đi đến tập tin "/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 

Bây giờ bạn có thể đặt nó trên các tuyến đường nơi bạn cần ví dụ

Route :: get ('someRoute', array ('sử dụng' => 'HomeController @ getSomeRoute', 'trung' => 'csrf'));

Đối với trường hợp của bạn, nơi bạn không cần mã thông báo CSRF, nó sẽ hoạt động tốt ngay bây giờ.

+0

Cuối cùng! Làm việc siêu tốt ngay bây giờ. Tôi đã tìm kiếm rất nhiều giải pháp phù hợp nhưng mọi người đã giải quyết liên quan đến các biểu mẫu html. Bạn phục vụ tôi với câu trả lời đúng. Cảm ơn bạn rất nhiều :) – Chandz

+1

vui vì nó đã làm việc ra;) –

+1

Cảm ơn Tariq Khan.Its làm việc cho tôi cũng – Amesh

14

Bạn không cần ghi đè đầy đủ mã thông báo CFSR từ ứng dụng của mình. Trong thư mục App/Http/Midlleware của bạn đi đến VerifyCsrfToken.php và bao gồm tuyến đường API của bạn đến ngoại lệ như sau:

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

Các * chương trình cho tất cả các tuyến đường bên trong API của bạn.

+0

Câu trả lời này hóa ra là an toàn hơn. –

+0

Tốt nhất và cách dễ nhất để làm –

0

Tôi đã gặp lỗi tương tự, nhưng với tất cả các cảnh báo về xác thực ghi đè CSRF, không muốn thay đổi các cài đặt đó.

Cuối cùng tôi thấy rằng Trình điều khiển phiên của tôi trong /config/session.php đã được đặt mặc định thành memcached và vì tôi đang ở trên máy chủ phát triển, tôi cần ghi đè biến env SESSION_DRIVER bằng 'tệp' để sử dụng phiên trong/bộ nhớ/khung/phiên.

/.env 

SESSION_DRIVER = file 
Các vấn đề liên quan