Имя: Пароль:
1C
1С v8
POST запрос, авторизация на exist.ru
,
0 prorokk
 
03.08.14
20:32
Добрый вечер
Нужно пройти авторизацию на exist.ru

1) Браузер отправляет POST в ответ получет Status Code:302 Found
2) Преходим на страничку личного кабинета

Делаю в 1с Код версия 1xxxx:

<code>
    Соединение = Новый HTTPСоединение("exist.ru");      
    Источник = КаталогВременныхФайлов() + "req.tmp";
    Результат = КаталогВременныхФайлов() + "answ.tmp";
    ЗапросПОСТ = Новый ЗаписьТекста(Источник, КодировкаТекста.ANSI, Символы.ВК + Символы.ПС, Ложь);
    ЗапросПОСТ.ЗаписатьСтроку("login="+LOGIN+"&pass="+PASS+"&hiddenInputToUpdateATBuffer_CommonToolkitScripts=1");
    ЗапросПОСТ.Закрыть();
    
    ЗаголовокHTTP = Новый Соответствие();
    ЗаголовокHTTP.Вставить("POST /profile/login.aspx HTTP/1.1");
    ЗаголовокHTTP.Вставить("Host: exist.ru");
    ЗаголовокHTTP.Вставить("Connection: keep-alive");
    ЗаголовокHTTP.Вставить("Content-Length: 773");
    ЗаголовокHTTP.Вставить("Cache-Control: max-age=0");
    ЗаголовокHTTP.Вставить("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    ЗаголовокHTTP.Вставить("Origin: http://exist.ru";);
    ЗаголовокHTTP.Вставить("User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 OPR/23.0.1522.60");
    ЗаголовокHTTP.Вставить("Content-Type: application/x-www-form-urlencoded");
    ЗаголовокHTTP.Вставить("DNT: 1");
    ЗаголовокHTTP.Вставить("Referer: http://exist.ru/profile/login.aspx";);
    ЗаголовокHTTP.Вставить("Accept-Encoding: gzip,deflate,lzma,sdch");
    ЗаголовокHTTP.Вставить("Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
    ЗаголовокHTTP.Вставить("Cookie: _vs=3074072b-7829-42c7-ad22-719de4fb8a6e; _sc=401ta5yn3unkvqfl24eenm0u; _md=0; _go=44; _gd=66; __utma=253479517.1334500211.1406968671.1407009254.1407081839.7; __utmb=253479517.4.10.1407081839; __utmc=253479517; __utmz=253479517.1406968671.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)");
    
    Ответ = Соединение.ОтправитьДляОбработки(Источник, "/profile/login.aspx", Результат, ЗаголовокHTTP);
    Сообщить(Ответ.КодСостояния);

<code>

В ответ получаю Состояние 400 (путь не найден)
Если Уменьшить ЗаголовокHTTP до пары строк то код 200...
Прошу помощи... Нужно пройти авторизацию...
1 prorokk
 
03.08.14
20:36
В процессе пляски с бубном и Методом Соединение.Получить()
Получилось получить ответ 302, который вел на страничку личного кабинета, но там было написано... "Ошибка авторизации, почитайте тут" а далее рассказ как чистить куки
2 kokamoonga
 
03.08.14
20:36
(0) убирай по одной строке, чтобы локализовать проблему.
3 prorokk
 
03.08.14
20:39
(2)
    ЗаголовокHTTP = Новый Соответствие();
    ЗаголовокHTTP.Вставить("POST /profile/login.aspx HTTP/1.1");
    ЗаголовокHTTP.Вставить("Host: exist.ru");

Дальше хоть какую строчку добавляю > Путь в ошибку.
4 prorokk
 
03.08.14
20:40
Может у кого есть Проверенный код авторизации POST-ом, а то в сети одни и теже статьи..
5 kokamoonga
 
03.08.14
20:45
(1) Рассказ как чистить куки он неспроста там появился. Куки-то нужно не от балды ставить, а соответствующие сессии.
6 prorokk
 
03.08.14
20:51
(5) Подскажи я правильно думаю?
1) Соединение.Получить() - Это GET?
2) Соединение.ОтправитьДляОбработки() - Это POST

Так вот, куки мне "придут" в ответе от сервера и они буду хранится в HTTPСоединение (что-бы сессия поддерживалась)
То что я привел в (0) это полный Заголовок POST-а взятый в OPERA, даже если я уберу ЗаголовокHTTP.Вставить("Cookie:.... Ничего не изменится... те же ошибки теже статусы...
7 Torquader
 
03.08.14
20:59
(6) Для авторизации обычно выдаётся "билет", то есть Cookie, в момент запроса кода страницы авторизации, чтобы можно было посчитать количество авторизаций, а также исключить подбор.
Вот эти куки нужно передать вместе с данными формы авторизации, после чего могут быть установлены или эти или другие Cookie для отслеживания созданной сессии.

Найти логирующий Proxy и зайди на сайт через него - сразу будет ясно, что и как передаётся.
8 kokamoonga
 
03.08.14
21:00
(6) вообще 400 это Bad Request
9 kokamoonga
 
03.08.14
21:01
(6) а в куках может быть записана какая-то хитрая внутрення переадресация
10 prorokk
 
03.08.14
21:04
тогда так получается?
1) Зашел на сайт получил куки1
2) Прохожу авторизацию отправляю куки1
3) Получаю куки2
4) юзаю куки2

И как 1с-кой получить КУКИ1?
11 kokamoonga
 
03.08.14
21:05
(9) + или просто захэшированы параметры предыдущего обращения в части юзер-агента и прочих вещей позволяющих идентифицировать пользователя
12 kokamoonga
 
03.08.14
21:11
Попробуй получить страницу в ПолеHTMLДокумента, заполнить нужные поля и сделать submit

Заодно можешь залоггировать все что ходит туда-обратно
13 prorokk
 
03.08.14
21:16
(12) Избегаю ПолеHTMLДокумента...(
(7) спасибо за идею с  "логирующий Proxy" что-то запрос от 1с не похож на то что Opera шлет... буду искать причины
14 kokamoonga
 
03.08.14
21:19
(13) >>> Избегаю ПолеHTMLДокумента

Есть на то какие-то причины?
15 prorokk
 
03.08.14
22:06
(14)только мнения других людей о его "глючности"

с Заголовком такая беда:

ЗаголовокHTTP.Вставить("Content-Type: application/x-www-form-urlencoded");

при этом в poste из 1с уже есть
Content-Type: application/octet-stream
Откуда он берется?
16 prorokk
 
03.08.14
22:51
Итак POST

в 1с-ом не хватает
Content-Type: application/x-www-form-urlencoded
вместо него 1с-ка пихает
Content-Type: application/octet-stream
и
Accept-Encoding: gzip,deflate,lzma,sdch

и Лишнее

Proxy-Authorization: NTLM TlRMTVNTUAABAAAAt7II4gkACQAsAAAABAAEACgAAAAGA4AlAAAAD1VTRVJXT1JLR1JPVVA=
и
Pragma: no-cache

как их исключить тоже не знаю..
17 kokamoonga
 
03.08.14
22:52
(16)
NTLM аутентификация используется по умолчанию для прокси-серверов, поддерживающих, данный способ аутентификации, и не требует дополнительных настроек, т.е. NTLM аутентификация будет использоваться, если в конструкторе объекта HTTPСоединение прокси не задан или задан, но без указания имени пользователя и пароля. Задание в конструкторе объекта HTTPСоединение прокси с указанным именем пользователя и паролем отключает NTLM аутентификацию, для аутентификации в этом случае используется HTTP Basic аутентификация.
18 prorokk
 
03.08.14
23:13
(17) Спасибо пробую... А сейчас Вот до чего дошли:
Для того что бы ПОСТ получил в ответ переадресацию (302) нужно
в ПОСТЕ заменить

Content-Type: application/octet-stream (его 1с-ка сама вставляет)
на
Content-Type: application/x-www-form-urlencoded


"Подделал" пакет отправил его в ответ получил переадресацию, но в ней сообщение
"Внимание! Авторизация не удалась"
19 kokamoonga
 
03.08.14
23:43
(18) нет идей, но интересно чем закончится:)
20 kokamoonga
 
03.08.14
23:48
(19) + по коду вроде все верно, разве что не указана кодировка:

application/x-www-form-urlencoded; charset=utf-8

Но это вроде как необязательная часть.
21 Torquader
 
04.08.14
00:06
Если на Windows, то можно ServerXMLHttpRequest попробовать использовать, по крайней мере, на VbScript с ним проблем не было никогда - даже сертификаты "кушал".
AdBlock убивает бесплатный контент. 1Сергей