2017-04-13 11 views
9

私のアプリはフロントエンドでReact、バックエンドでLaravel 5.4を使用しています。私はfetch()を使ってバックエンドからデータを要求しています。問題は、ページが読み込まれたときに2つのセッションが作成されることです。 TokenMismatchExceptionは、POST要求が行われたときにCSRFミドルウェアによってスローされます。これは、送信されるトークンが、作成された最初のセッションに一致しますが、2番目のセッションと照合するためです。LaravelへのフェッチAPIによって新しいセッションが作成される

a:3:{s:6:"_token";s:40:"7obvOzPaqqJDtVdij8RaqrvmTFLjKA2qnvYMxry6";s:9:"_previous";a:1:{s:3:"url";s:24:"http://localhost/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}} 

a:3:{s:6:"_token";s:40:"5Aiws9Qy72YzlkfWX81zkhzrSeiMDYjFWiLeDAwN";s:9:"_previous";a:1:{s:3:"url";s:41:"http://localhost/api/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}} 

要求:

私はapp.blade.php

<meta name="_token" content="{{ csrf_token() }}">

にトークンを設定し、フェッチ設定ここで

fetchConfig = { 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
     'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') 
    }, 
    credentials: 'same-origin' 
}} 

にトークンをつかんだが復号化されたセッションですURL:http://localhost/page

APIのURL:http://localhost/api/page

私が反応アプリはその初期GET要求を行うときに作成されてから新しいセッションを防ぐことができますどのように?

+0

どのセッションドライバーを使用していますか? –

+0

私は 'file'セッションドライバを使用しています。 – bill

+0

JWT Auth(JSON Webトークン認証)トークンをLaravel APIに使用した場合。 APIは状態を維持できないためです。したがって、Csrfトークン検証が必要な場合は、それをメタタグまたはJWTペイロード内にプライベートクレームとして格納して実装する必要があります。 –

答えて

9

をご確認ください。このトークンは、認証されたユーザーが実際にアプリケーションに要求を出すものであることを確認するために使用されます。 :https://laravel.com/docs/5.4/csrf

APIはステートレスです。 APIにはsessionのようなものはありません。したがって、APIではCSRFトークンを使用しないでください。 laravelのKernel.phpをチェックした場合。あなたはTylorがAPIグループにVerifyCsrfミドルウェアを追加していないことがわかります。これは、CSRFが、セッションを有する要求、すなわちステートフル要求においてのみ使用されることを示唆する。 JWTベースの認証システムをAPIに使用することをお勧めします。 JWT check hereについての詳細

あなたはJWTのために、このlaravelパッケージを使用することができます:あなたはhttps://github.com/tymondesigns/jwt-auth

5

あなたのリクエストURLは何か、ターゲットAPI URLは何か分かりません。両方が同じドメイン(サブドメインを含む)にあることを確認してください。

私はあなたが以下のクラスファイル追加していることを行うことができますネイティブアプリケーションなど

、これらは、他のドメインで使用されるかもしれないとしてのみAPIルートにCSRFの検証を無効にするには、その良いアイデアだと思います:アプリ/ HTTP /ミドルウェア/どのようにLaravelたちより多くを学ぶためには

protected $middleware = [ 
    'csrf' => 'App\Http\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 = [ 
     'api/*', 
    ]; 
} 

VerifyCsrfToken.php新しいクラスを指すようにKernal.phpを編集することを確認しますES CSRFはLaravelは自動的にアプリケーションによって管理される各アクティブユーザーセッションためCSRF「トークン」を生成this laracast video

+0

ありがとうございました!私はセッションデータに隠されているので、リクエストとapiのURLを質問に追加しました。あなたのソリューションはcsrfミドルウェアをバイパスして動作しますが、複数のセッションがまだ作成されています。私は可能ならばそれを修正するのが理想的です。 – bill

関連する問題