OTCloud
@OTCloud
Программирование и Архитектура ПО

Почему ломается токен при авторизации через curl?

Всем привет!
Есть проблема с авторизацией на сайте через скрипт (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);
}
  • Вопрос задан
  • 206 просмотров
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Судя по описанию всё делаете по уму
Нужно лишь найти ошибку в коде. На вскидку:
1. Убедиться что в $postFields не пустой токен
2. Проверить отправляемые куки
3. Возможно не хватает какого-то http-заголовка, например принимающая сторона так же проверяет Referrer или не принимают запросы с подозрительными user-agent типа Curl.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы