Всем привет!
Есть проблема с авторизацией на сайте через скрипт (php curl). Проблема заключается в том, что при отправке POST запроса для авторизации "ломается" csrf токен, из-за чего происходит рекдирект обратно на страницу авторизации и в форме отображается ошибка "Invalid CSRF token".
Флоу парсинга такой:
1. GET запрос для получения html страницы авторизации + открытие сессии и запись куков;
2. Парсинг CSRF токена через PhpQuery;
3. Отправка POST запроса с данными для авторизации + токен в виде "application/x-www-form-urlencoded" + запись и чтение кукисов;
на 3м шаге собственно и происходит ошибка, не могу разобраться, может кто знает? код ниже.
1. GET запрос и парсинг токена
// GET CSRF TOKEN
$connectionStream = curl_init();
curl_setopt_array($connectionStream, [
CURLOPT_URL => $LOGIN_PAGE_URL,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HEADER => 0,
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => $COOKIE_FILE,
]);
$response = curl_exec($connectionStream);
$responseCode = curl_getinfo($connectionStream, CURLINFO_HTTP_CODE);
if($responseCode === 200)
{
$phpQuery->load_str($response);
$nodesCollection = $phpQuery->query('[name="_csrf_token"]');
$token = $nodesCollection[0]->getAttribute('value');
}
2. POST запрос для авторизации
// LOGIN
$postFields = implode('&', [
'_csrf_token=' . $token,
'_username=' . $LOGIN_NAME,
'_password=' . $LOGIN_PASS,
'_submit=',
]);
curl_setopt_array($connectionStream, [
CURLOPT_URL => $LOGIN_REQUEST_URL,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $postFields,
CURLOPT_RETURNTRANSFER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => $COOKIE_FILE,
CURLOPT_COOKIEFILE => $COOKIE_FILE,
CURLOPT_HEADER => 0,
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded',
'Upgrade-Insecure-Requests: 1',
]
]);
$response = curl_exec($connectionStream);
$responseCode = curl_getinfo($connectionStream, CURLINFO_HTTP_CODE);
if($responseCode === 200)
{
var_dump($response);
}