web-dev-qa-db-fra.com

Pourquoi Laravel Api renvoie le code de statut 419 sur POST et la méthode PUT?)?

J'essaie de créer une API reposante en utilisant laravel et créer mon contrôleur en utilisant php artisan make: contrôleur RestController et voici mon code de contrôleur:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RestController extends Controller
{
    private $arr = array(
            array("name"=>"jon", "family"=>"doe"),
            array("name"=>"jhon", "family" => "doue")
        );
    public function index(){
        return json_encode($this->arr);
    }

    public function store(Request $request){
        return "oops!!";
    }

    public function update (Request $request, $id){
        return "test";
    }

}

et j'ajoute cette ligne de code pour créer cette route dans mon fichier routes/web.php

Route::resource('person', 'RestController');

lorsque j'essaie de tester cette API sur GET/personne, cela fonctionne bien, mais sur post et mis, je reçois le code de statut 419 de laravel.

20
Navid_pdp11

si vous développez un repos apis, il est préférable de ne pas ajouter de jeton .si vous utilisez 5.4 ou 5.5, vous pouvez utiliser api.php au lieu de web.php. Dans api.php, vous n'avez pas besoin de la vérification de jeton sur une requête ultérieure.

si vous utilisez web.php, alors vous êtes excusez-vous. Voici la documentation officielle

Exclusion des URI de la protection CSRF

Parfois, vous souhaiterez peut-être exclure un ensemble d’URI de la protection CSRF. Par exemple, si vous utilisez Stripe pour traiter des paiements et utilisez son système webhook, vous devez exclure votre itinéraire de gestionnaire de compte Web Stripe de la protection CSRF, car Stripe ne saura pas quel jeton CSRF envoyer sur vos itinéraires.

En règle générale, vous devez placer ces types de routes en dehors du groupe de middleware Web que RouteServiceProvider applique à toutes les routes du fichier routes/web.php. Cependant, vous pouvez également exclure les routes en ajoutant leurs URI à la propriété $ except du middleware VerifyCsrfToken:

<?php

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];
}

pour référence

https://laravel.com/docs/5.5/csrf

28
iCoders

Selon ma connaissance, il existe deux méthodes pour résoudre ce problème

Méthode 1: - Ajouter un jeton CsrF

Méthode 2: - Exclure les URI de la protection CSRF

Comment utiliser

Méthode 1: - Ajoutez une autre variable à votre demande POST.

"_token": "{{ csrf_token() }}"

Exemple pour Ajax

 req = $.ajax({
    type: "POST",
    url: "/search",
    data: {'key' : 'value',
    "_token": "{{ csrf_token() }}",},
    dataType: "text",
    success: function(msg){

    }
});

Exemple si vous utilisez des formulaires

<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">

Méthode 2 Il y a un fichier nommé 'VerifyCsrfToken' à l'emplacement suivant

yourProjectDirectory --> app->Http--> Middleware

Ajoutez votre URL dans la méthode suivante

 protected $except = [

            'url1/',
            'url2/',

 ];

Quand utiliser

  • Si vous êtes le propriétaire (contrôle total) de l'API, utilisez la méthode 1, car CSRF TOKEN ajoute la sécurité à votre application.

  • Si vous ne parvenez pas à ajouter de jeton CSRF comme dans le cas où vous utilisez des API, des Webhooks, etc. de tiers, utilisez la Méthode 2.

14
Puneet Verma