Symfony 3.4 и CSRF-токен в функциональных тестах - PullRequest
0 голосов
/ 17 января 2019

Я выполняю некоторые функциональные тесты с Symfony 3.4, но у меня проблема с отправкой формы с токеном CSRF.
Я перепробовал много решений, но это не помогает:

private function makeAuthenticatedClient()
{
    $credentials = array(
        'username' => $this->user->getUsername(),
        'password' => $this->user->getPassword(),
    );

    return $this->makeClient($credentials);
}

public function testAdd()
{
    $client = $this->makeAuthenticatedClient();

    $crawler = $client->request('POST', '/teachers/add');

    // generates the CSRF token
    $csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken('division_item');

    $client->request(
        'POST',
        '/teachers/add',
        [
            'teachers' => [
                'name' => 'Test',
                '_token' => $csrfToken,
            ]
        ],
        [],
        ['HTTP_X-Requested-With' => 'XMLHttpRequest']
    );

    $this->assertTrue(
        $client->getResponse()->isRedirect('/teachers/list')
    );
}

И в моем виде:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Teacher::class,
        'csrf_token_id' => 'division_item',
    ));
}

Что я делаю не так?

1 Ответ

0 голосов
/ 17 января 2019

Проблема возникла из-за того, что я генерировал маркер CSRF после выполнения запроса. Это привело к тому, что токен сгенерировался дважды (я обнаружил, что он сбрасывает вещи в CsrfTokenManager).

Это работает:

// generates the CSRF token
$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken('division_item');

$crawler = $client->request('POST', '/teachers/add');
...