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 => {