web-dev-qa-db-ja.com

Laravel AP​​IがPOSTおよびPUTメソッドで419ステータスコードを返すのはなぜですか?

laravelを使用してRestful APIを作成し、php artisan make:controller RestControllerを使用してコントローラーを作成しようとしています。これがコントローラーコードです。

<?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";
    }

}

このコード行を追加して、routes/web.phpファイルにこのルートを作成します

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

gET/personでこのAPIをテストしようとすると、正常に動作しますが、投稿して置くと、laravelから419ステータスコードを取得しています。

20
Navid_pdp11

トークンを追加しないようにREST APIを開発する場合は、5.4または5.5を使用している場合、web.phpの代わりにapi.phpを使用できます。api.phpでは、ポストリクエストでトークンの検証が必要ありません。

web.phpを使用している場合、トークンを除外します。公式ドキュメントはこちら

CSRF保護からURIを除外する

CSRF保護からURIのセットを除外したい場合があります。たとえば、Stripeを使用して支払いを処理し、Webhookシステムを使用している場合、Stripeはルートに送信するCSRFトークンを認識しないため、Stripe webhookハンドラールートをCSRF保護から除外する必要があります。

通常、これらの種類のルートは、RouteServiceProviderがroutes/web.phpファイル内のすべてのルートに適用するWebミドルウェアグループの外部に配置する必要があります。ただし、VerifyCsrfTokenミドルウェアの$ exceptプロパティにURIを追加して、ルートを除外することもできます。

<?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/*',
    ];
}

参考のため

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

28
iCoders

私の知識によると、これを解決する2つの方法があります

方法1:-CsrFトークンを追加する

方法-2:-CSRF保護からURIを除外する

使用方法

方法1:-POSTリクエストにもう1つの変数を追加します。

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

Ajaxの例

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

    }
});

フォームを使用する場合の例

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

方法2次の場所に「VerifyCsrfToken」という名前のファイルがあります

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

次の方法でURLを追加します

 protected $except = [

            'url1/',
            'url2/',

 ];

使用する場合

  • APIの所有者(フルコントロール)である場合は、CSRFトークンがアプリケーションにセキュリティを追加するため、方法1を使用します。

  • サードパーティAPIを使用している場合など、CSRFトークンを追加できない場合は、方法2にwebhookなどを使用します。

14
Puneet Verma