При передаче строки в качестве данных POST тестовый пример интеграции не устанавливает автоматически токены, ни токен CSRF, ни токен безопасности, поскольку он не может ничего вставить в строку, не зная о формате данных. Следовательно, он также не будет устанавливать cookie.
Таким образом, в случаях, когда вы передаете строковые данные, вам необходимо установить cookie и токен вручную, аналогично тому, как описано в ответе, который вы связали. Однако при использовании чего-либо, кроме application/x-www-form-urlencoded
данных (то есть данных, которые PHP будет декодировать и помещать в суперглобальный $_POST
), в вашем примере данных JSON вы должны передать токен в качестве заголовка, поскольку входные данные JSON будут декодируется компонентом обработчика запросов (есть планы переместить это на уровень промежуточного программного обеспечения IIRC), который запускает после промежуточного программного обеспечения CSRF, который, следовательно, не будет видеть никаких данных постов.
Пример:
$token = 'my-csrf-token';
$this->cookie('csrfToken', $token);
$this->configRequest([
'headers' => [
'X-CSRF-Token' => $token,
// ...
]
]);
С другой стороны, токены компонента безопасности должны были бы идти в данных POST, компонент безопасности не будет искать заголовки, и он будет иметь доступ к декодированным данным после запуска компонента обработчика запросов (убедитесь, что вы загрузить компонент обработчика запросов до компонента безопасности!). Вы можете обратиться к источнику \Cake\TestSuite\IntegrationTestTrait::_addTokens()
, чтобы выяснить, как создаются токены безопасности, вы бы сделали это примерно так:
$url = '/feedback/add';
$_data = [
'crash' => 1,
'details' => 'Lorem ipsum dolor sit amet'
];
$keys = array_map(
function ($field) {
return preg_replace('/(\.\d+)+$/', '', $field);
},
array_keys(Hash::flatten($_data))
);
$tokenData = $this->_buildFieldToken($url, array_unique($keys));
$_data['_Token'] = $tokenData;
$_data['_Token']['debug'] = 'SecurityComponent debug data would be added here';
Обратите внимание, что URL, который передается на _buildFieldToken()
, также должен включать возможные данные строки запроса!