使用 PHPUnit 的 Symfony 登录抛出无效的 CSRF 令牌

Symfony login with PHPUnit throws invalid CSRF token

我正在尝试为登录表单编写 PHPUnit 测试 - 这应该可行.. 因为在浏览器中手动,我可以与用户一起登录。我一遍又一遍地收到错误 "Invalid CSRF token"。我究竟做错了什么?这是一个非常基本的登录表单,根本没有太多逻辑:

这是用于登录的 phpunit 测试:

public function testLoginSuccess()
{
  $client = $this->createClient();
  $csrfToken = $client->getContainer()->get('security.csrf.token_manager')->refreshToken('authenticate');

  $client->request(
      'POST',
      '/login_check',
      array(
          "app_user_login" => array(
              "_csrf_token"               => $csrfToken,
              "_username"                 => 'tester',
              "_password"                 => 'test1234'
          )
      ),
      array(),
      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
  );

  $response = $client->getResponse();

  $this->assertEquals(
      Response::HTTP_OK,
      $response->getStatusCode()
  );
}

在视图中,我将令牌呈现为:

            <input type="hidden" name="_csrf_token"
                   value="{{ csrf_token('authenticate') }}">

我的安全 yml 如下:

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: user_provider
            csrf_token_generator: security.csrf.token_manager
            csrf_parameter: _csrf_token
            csrf_token_id: authenticate
            default_target_path: /
            success_handler: app.security.authentication_handler
            failure_handler: app.security.authentication_handler
            login_path:  /login
            check_path:  /login_check
            require_previous_session: false
        logout:       true
        anonymous:    true

当 运行 测试时,它总是跳入 onAuthenticationFailure 处理程序并向我提供错误消息 "Invalid csrf" .. 我尝试了所有我能想到的 - 这是一个非常奇怪的行为。如何在 phpunit 测试中正确使用 csrf?

我找到了解决方案..传递参数时,我的一个数组在另一个数组中太多了....

在我的例子中,我不得不传递内部数据数组 $csrfToken->getValue() 而不是 $csrfToken 。否则我有一个错误:

TypeError: 传递给 Symfony\Component\Security\Csrf\CsrfToken::__construct() 的参数 2 必须是字符串类型或 null