2015-01-14 18 views
6

Ich habe einen API-Aufruf mit Post-Daten; Sagen wir, das ist der Anmeldeprozess.Laravel API TokenMismatchException

Mit der Postbote Erweiterung von Chrome I, per Post, der Benutzername und das Passwort sende in den Benutzer anmelden Aber ich diese Nachricht erhalten:.

Illuminate \ Session \ TokenMismatchException 

In meiner Basissteuerung ich habe:

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

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

    } 

Wenn ich die Zeile mit dem beforeFilter lösche, funktioniert alles einwandfrei. Aber das kann keine Lösung sein. Jeder POST-Aufruf würde diese Fehlermeldung erhalten. Ich weiß, dass ich dieses Token brauche. Aber wie bekomme ich dieses Token, wenn ich von der API anrufe? Ich weiß, dass ich in Laravel ein Token erstellen kann, aber wie kann ich das tun, wenn ich von außen über API anrufe?

+0

Weil Sie benötigen das Token über als Parameter, wie der csrf Filter senden das _token Feld des Eingangs überprüfen. Wenn Sie es nicht senden, wird diese Überprüfung fehlschlagen. –

+0

ok. Say für mehrdeutige Beschreibung ... Ich weiß, dass ich dieses Token brauche.Aber wie bekomme ich dieses Token wenn ich die API anrufe? Ich weiß, dass ich ein Token in Laravel erstellen kann, aber wie kann ich das tun, wenn ich von außen über API anrufe? – goldlife

+0

Im Allgemeinen werden APIs für Cross-Site-Anfragen verwendet. Ihr CSRF-Schutz ist also sinnlos. Es wird hauptsächlich für Anwendungen und Websites verwendet. Aber deaktivieren Sie es bei der Anmeldung und dann bei erfolgreicher Anmeldung senden Sie den Benutzer den Wert csrf_token durch den Aufruf des Helfers 'csrf_token();' –

Antwort

9

Im Allgemeinen werden APIs für Cross-Site-Anfragen verwendet. Ihr CSRF-Schutz ist also sinnlos.

Wenn Sie es nicht Cross-Site verwenden, ist die Wahrscheinlichkeit, dass eine API nicht die optimale Lösung für das, was Sie versuchen, ist. Anyway, you könnte einen API-Endpunkt, der ein Token zurückgibt.

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

Wenn Sie auf einige Methoden CSRF-Schutz deaktivieren möchten, könnten Sie except oder only verwenden.

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

Bitte beachten Sie die official Laravel documentation.

1

nur zuhören. Kurz vor 30 Minuten hatte ich das gleiche Problem. Jetzt hat es gelöst. versuch es einfach.

Goto App -> HTTP-> Kernel

öffnen Sie die Kernel-Datei.

dort können Sie sehen: \ App \ Http \ Middleware \ VerifyCsrfToken :: Klasse,

deaktivieren gerade diesen besonderen Code //

Thatz it! Das wird funktionieren!

Damit Sie die Middleware von den API aufrufen entfernen können (wenn Sie so wollen ..)

5

Absolut don't use diesen Ansatz.

Öffnen Sie VerifyCsrfToken Klasse und definieren Sie $except Eigenschaft, die ein Array von Routen enthält, wo CSRF-Schutz nicht angewendet wird.

Beispiel unten:

<?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); 
    } 
} 
Verwandte Themen