17

機能テストを書いていますが、ajax 投稿リクエストを行う必要があります。「CSRF トークンが無効です。フォームを再送信してください」 . 機能テストでトークンを取得するにはどうすればよいですか?

$crawler = $this->client->request(
  'POST', 
  $url, 
  array(
      'element_add' => array(
          '_token' => '????',
          'name'   => 'bla',
      )

  ), 
  array(), 
  array('HTTP_X-Requested-With' => 'XMLHttpRequest')
);
4

4 に答える 4

22

CSRFトークンジェネレーターは通常のsymfony2サービスです。自分でサービスを受けてトークンを生成できます。例えば:

    $csrfToken = $client->getContainer()->get('form.csrf_provider')->generateCsrfToken('registration');
    $crawler = $client->request('POST', '/ajax/register', array(
        'fos_user_registration_form' => array(
            '_token' => $csrfToken,
            'username' => 'samplelogin',
            'email' => 'sample@fake.pl',
            'plainPassword' => array(
                'first' => 'somepass',
                'second' => 'somepass',
            ),
            'name' => 'sampleuser',
            'type' => 'DSWP',
        ),
    ));

generateCsrfTokenは、テストと形式で同じである必要がある1つの重要なパラメーターの意図を取得します。それ以外の場合は失敗します

于 2013-03-06T08:10:56.403 に答える
13

長い検索の後(csrfトークンを取得する方法について、ドキュメントとネットで何も見つかりませんでした)、方法を見つけました:

$extract = $this->crawler->filter('input[name="element_add[_token]"]')
  ->extract(array('value'));
$csrf_token = $extract[0];

リクエストを行う前に、レスポンスからトークンを抽出します。

于 2012-03-02T10:31:23.833 に答える
8

symfony 3 ではWebTestCase、CSRF トークンを取得する必要があります:

$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken($csrfTokenId);

を取得するには、 ()のオプションでそれを強制する$csrfTokenIdのが最善の方法です。FormType

class TaskType extends AbstractType
{
    // ...

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'csrf_token_id'   => 'task_item',
        ));
    }

    // ...
}

したがって、この場合: $csrfTokenId = "task_item";. または、フォームの名前であるデフォルト値を使用することもできます。

次に、post パラメータとして使用します。

$client->request(
  'POST',
  '/url',
  [
    'formName' => [
      'field' => 'value',
      'field2' => 'value2',
      '_token' => $csrfToken
    ]
  ]
);
于 2016-07-29T14:29:14.197 に答える