使用 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
我正在尝试为登录表单编写 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