2016-09-10 33 views
1

twigで私はcsrfトークン({{ csrf_token('my_intention') }})を生成します。symfony 3、フェッチAPI付きの "ajaxリクエスト"、CSRF

Javascriptでは、実際にはFetch API(Ajax xmlHttpRequestも試してみました)、POSTリクエストでコントローラを呼び出しています。要求で渡されたトークンを含む引数名は 'token = abcdef ...'です。

AJAX:

var httpRequest = new XMLHttpRequest(); 
    httpRequest.onreadystatechange = function (data) { 
     console.log(data); 
    }; 

    httpRequest.open('POST', el.getAttribute("data-url")); 
    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    httpRequest.send(.......); 

取得API:私は、POSTリクエストからのデータとして送信されるトークンを取得と呼ばれるコントローラのアクションで

 fetch(el.getAttribute('data-url'), { 
      method: 'post', 
      headers: { 
       "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" 
      }, 
      body: 'token=' + encodeURIComponent(el.getAttribute('data-token')) 
     }).then(data => data.text()).then(data => {...} 

。コントローラーで次のようなトークンを確認します:

$token = $request->request->get('token'); 
    if (!$this->isCsrfTokenValid('my_intention', $token)) { 
     throw new InvalidCsrfTokenException("error csrf 2"); 
    } 

しかし、symfonyはトークンが有効ではないと言います。

私は確信していませんが、トークンがセッション変数に見つかりません。 isTokenValid()$this->storage->hasToken($token->getId())にはfalseが返されます。

ブラウザでは、URLを直接呼び出すと問題ありません。

私はこのdata-url="{{ path('_check', {'id': transaction.id}) }}"のようなデータ属性を呼び出すためのURLを設定し、次にこのデータ属性をjavascriptから読み込み、ajax/fetch関数に渡します。

は私が... jQueryの$ .post(とAJAXを試してみましたが、それが唯一の違いはクッキーで動作します。。PHPSESSIDを...リクエストヘッダにjQueryを使っていない私の元のコードに

私にはありません?symfonyの3.1.3

私のコードが間違っているものを、理解

EDIT:が解決:私は、symfonyはセッションを見つけるとトークン確認するための方法は、ヘッダー要求で資格情報を渡さない、そうしませんでした。

fetch(el.getAttribute('data-url'), { 
     method: 'post', 
     headers: { 
      "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 
      "X-Requested-With": "XMLHttpRequest" 
     }, 
     body: 'token=' + el.getAttribute('data-token'), 
     credentials: 'include' 
    }).then(data => data.text()).then(data => { 

答えて

0

問題の答えが見つかったとしても、サーバー側で定義されたCookieに基づいてトークンの検証を処理し、各非同期要求を渡す必要があるこのバンドルをお勧めします。

https://github.com/dunglas/DunglasAngularCsrfBundle

関連する問題