Не могу реализовать автологин
Это конечно достаточно непростая задача, поэтому мне бы хотя бы просто подсказки от тех кто имел дело с подобным.
Есть сайт 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 код перестал записывать второй куки(сессия), а пишет только первый.
Ну ладно, сейчас попробую передать все аргументы.
