2015-01-14 13 views
6

Ho una chiamata API con dati post; diciamo che questa è la procedura di accesso.Laravel API TokenMismatchException

Con l'estensione del postino di Chrome mando, via posta, il nome utente e la password per accedere l'utente nella Ma ho ottenuto questo messaggio:.

Illuminate \ Session \ TokenMismatchException 

Nel mio controller della base ho:

/** 
    * Initializer. 
    * 
    * @return void 
    */ 
    public function __construct() { 
     // CSRF Protection 
     $this->beforeFilter('csrf', array('on' => 'post')); 

     // Layouts/Notifications 
     $this->messageBag = new Illuminate\Support\MessageBag; 

    } 

Quando elimino la riga con beforeFilter, tutto funziona correttamente. Ma questa non può essere una soluzione. Qualsiasi chiamata POST otterrebbe questo messaggio di errore. SO che ho bisogno di questo _token. Ma come ottengo questo token quando chiamo dall'API? So che posso creare un token in Laravel, ma come posso farlo quando chiamo da fuori tramite API?

+0

Perché è necessario inviare il token attraverso come un parametro, come il filtro CSRF controllerà il campo _token dell'ingresso. Se non lo invii, questo controllo fallirà. –

+0

ok. sry per la descrizione ambigua ... SO che ho bisogno di questo _token.Ma come ottengo questo token quando chiamo l'API? So che posso creare un token all'interno di laravel, ma come posso farlo quando chiamo da fuori tramite API? – goldlife

+0

Generalmente le API vengono utilizzate per richieste cross-site. Quindi la tua protezione CSRF è inutile. È principalmente utilizzato per applicazioni e siti Web. Ma disabilitatelo al momento del login, e poi al login riuscito inviate all'utente il valore csrf_token chiamando l'helper 'csrf_token();' –

risposta

9

Generalmente le API vengono utilizzate per richieste cross-site. Quindi la tua protezione CSRF è inutile.

Se non lo si utilizza in cross-site, è probabile che un'API non sia la soluzione ottimale per ciò che si sta tentando di fare. Ad ogni modo, tu potresti creare un endpoint API che restituisca un token.

public function getToken(){ 
    return Response::json(['token'=>csrf_token()]); 
} 

Se si desidera disabilitare CSRF protezione su alcuni metodi, si potrebbe usare except o only.

$this->beforeFilter('csrf', array('on' => 'post', 
           'except'=>array('methodName', 'anotherMethod') 
           )); 

Fare riferimento allo official Laravel documentation.

1

basta ascoltare questo. Poco prima dei 30 minuti ho affrontato lo stesso problema. Ora è risolto. provalo

Goto App -> HTTP> Kernel

aprire il file del kernel.

lì si può vedere: \ App \ Http \ Middleware \ VerifyCsrfToken :: classe,

basta eliminare questa particolare codice usando //

Thatz esso! Questo funzionerà!

In modo che è possibile rimuovere il middleware dalla chiamata API (se si desidera così ..)

5

Assolutamente don't use questo approccio.

Aprire VerifyCsrfToken classe e definire la proprietà $except che conterrà una serie di percorsi, in cui la protezione CSRF non verrà applicata.

Esempio di seguito:

<?php 
declare(strict_types=1); 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; 

class VerifyCsrfToken extends BaseVerifier 
{ 
    protected $except = [ 
     'api/auth/login', 
     'api/*', // this works as well 
    ]; 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure     $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     return parent::handle($request, $next); 
    } 
}