Не могу реализовать автологин

Это конечно достаточно непростая задача, поэтому мне бы хотя бы просто подсказки от тех кто имел дело с подобным.

Есть сайт http://auto.vsk.ru/login.aspx, нужно логиниться на нём с другого (моего) сайта, и использовать последующий функционал как залогиненый пользователь.

Через Devtools просмотрел что при успешном логине делается post-запрос к http://auto.vsk.ru/login.aspx?ReturnUrl=%2fdefault.aspx со следующими аргументами:

введите сюда описание изображения

Окей, с логином и паролем понятно, где брать остальные? Погуглил названия и понял что сайт написан на asp.net (хотя это должно было быть понятно по расширения файла .aspx), с которым я абсолютно не знаком.

Сейчас через curl отравляю такой запрос:

post.php

<?php

function request($post)
{
$ch = curl_init();
$curlConfig = array(
CURLOPT_URL            => 'http://auto.vsk.ru/login.aspx?ReturnUrl=%2fdefault.aspx',
CURLOPT_POST           => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_COOKIEFILE => __DIR__.DIRECTORY_SEPARATOR.'vskcookies.txt',
CURLOPT_COOKIEJAR => __DIR__.DIRECTORY_SEPARATOR.'vskcookies.txt',
CURLOPT_USERAGENT => '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)"',
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_REFERER => $_SERVER['REQUEST_URI'],
CURLOPT_POSTFIELDS  => $post,
CURLOPT_HTTPHEADER => array("Content-Type: application/json;charset=utf-8"),
CURLOPT_NOBODY => 0,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_SSL_VERIFYPEER => 0
);
curl_setopt_array($ch, $curlConfig);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

$result = request($_POST['data']);

if ($result === FALSE) 
 echo('error');
else
 echo($result);

?>

Javascript на сайте:

function requestp(path, data, run)
{
var http = new XMLHttpRequest();
http.open('POST', path, true);

http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

http.onreadystatechange = function() 
{  
if(http.readyState == 4 && http.status == 200)
{
run(http);
}
}

http.send(data);
}

requestp('post.php',encodeURIComponent('adLogin%24UserName=тутлогин&adLogin%24Password=тутпароль&adLogin%24AuthorizationType=Sql'),function(e){
document.getElementById('container').innerText=e.responseText;
});

Но получаю ту же login.aspx, хотя должен быть редирект на Sales/Default.aspx. Тем не менее в vskcookies.txt после отправки запроса появляются данные:

# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_auto.vsk.ru   FALSE   /   FALSE   0   BIGipServerauto-ext-vla216-pool значение
#HttpOnly_auto.vsk.ru   FALSE   /   FALSE   0   ASP.NET_SessionId   значение

Что делать и что я делаю не так?


P.S.: С браузера не Internet Explorer’а сайт тоже работает, ну по-крайней мере залогиниться (вручную естественно) можно.


Обновление

Погуглив, оказалось что данные в __VIEWSTATE и подобных это base64-строка, которая легко декодится. Собственно в вьюстэит было, среди прочего мусора следующее:

FailureTextВаша единая учетная запись не подключена, либо пароль введен неправильно.

Но этот аргумент имеет такое значение даже при успешном логине, значит его можно передавать так.

Остальные аргументы начинающиеся с «__» всегда константы, а значит остался один - последний: adLogin$RequestId


Обновление 2

Можно обратить внимание, что после ввода логина и снятия фокуса с поля для ввода происходит перезагрузка страницы, в результате отправки вышеописанного POST запроса без adLogin$RequestId и пароля. После перезагрузки появляется новый куки параметр - ASP.NET_SessionId, и уже после этого Вы вводите пароль отправляется конечный запрос с паролем.

Наверное для автологина нужно тоже отправлять запрос дважды.


Обновление 3

Хорошо, значит логика там такая, при самом первом заходе на страницу записывается первый куки - BIGipServerauto-ext-vla216-pool. Затем пользователь вводит логин, и после потери фокуса делается post-запрос с отправкой этого логина и обновлением страницы. Если логина нет в базе, то на новой странице будет соответствующее сообщение. Также записывается новый куки (см. Обновление 2). Если логин есть, то искомое значение adLogin$RequestId будет здесь:

<input type="hidden" name="adLogin$RequestId" id="adLogin_RequestId" value="здесь значение">

Вот только блин, почему-то мой php код перестал записывать второй куки(сессия), а пишет только первый.

Ну ладно, сейчас попробую передать все аргументы.


Ответы (0 шт):