Имя: Пароль:
1C
 
HTTP авторизация на сайте через POST запрос
, ,
0 nikolas260579
 
19.05.17
13:46
Здравствуйте. Формирую POST-запрос для авторизации на сайте. Надо программно ввести логин/пароль и нажать кнопку "Войти". Конечная цель - получить оттуда отчёт в Экселе и обработать его в 1С. При авторизации мне возвращается в HTTP - ответе код состояния 302 (также, как когда выполняю этот запрос прямо в Firefox-е), но 1С, в отличие от браузера, в заголовке ответа "Location" возвращает ошибку 404.

В чём может быть дело?
Запрос на авторизацию такой:
Попытка
       Соединение = Новый HTTPСоединение("lk-ofd.taxcom.ru",443,"moeimya.familiya%40adres-pochty.ru","12345678",Прокси,120,ЗащищенноеСоединениеOpenSSL);//lk-ofd.taxcom.ru      
   Исключение
       Сообщить("Не удалось установить соединение с сервером такскома"
       + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
       Возврат;
   КонецПопытки;
  
   Попытка
       //формируем HTTP запрос на авторизацию
       HTTPЗапрос = Новый HTTPЗапрос("https://lk-ofd.taxcom.ru/",Заголовки);//("https://lk-ofd.taxcom.ru/");"/api/accountinfo";
       //Соединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
       Соединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
      
       HTTPЗапрос.УстановитьТелоИзСтроки("ReturnUrl=&AccountId=12345&Email=moeimya.familiya%40adres-pochty.ru&Password=12345678");
       HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
       //здесь буду выдавать сообщения об ошибках
       Если HTTPОтвет.КодСостояния > 299 Тогда
           //обрабатываем ошибки
          
       Иначе
           //теперь делаем GET - запрос
       КонецЕсли;
      
   Исключение
      
       ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
       Сообщить(Строка(" "+ОписаниеОшибки));
   КонецПопытки;
Может, тут где ошибка? Тело запроса я скопировал из браузера. Заголовок запроса сейчас пока оставил один - Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
Исследую эту же страничку через Хром - там в необработанных данных  тело запроса. Кто что посоветует? Первый раз работаю с HTTP. Заранее спасибо.
1 Ц_У
 
19.05.17
13:47
навскидку, а 1с работает с ххтпс?
2 nikolas260579
 
19.05.17
13:49
(1) Вроде о общем модуле есть для ЕГАИСА процедуры, там GET
3 ELEA26
 
19.05.17
14:43
(1) конечно!
4 ELEA26
 
19.05.17
14:50
(0) ЗащищенноеСоединениеOpenSSL - как инициализировано?

Хотя бы:
ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL(
            Неопределено,
            Неопределено);

?

%40 - точно проходит? Почему не @? Это в браузере %40 надо, а в строке 1С вроде @ разве не прокатывает. Не уверен правда.

"выполняю этот запрос прямо в Firefox-е" - Как ты из браузера POST делаешь? Может GET?

Новый HTTPЗапрос("https://lk-ofd.taxcom.ru/";,Заголовки)
надо:
Новый HTTPЗапрос("/",Заголовки) т.к. домен в Соединении уже есть.
5 ELEA26
 
19.05.17
14:52
HTTPЗапрос.УстановитьТелоИзСтроки - проверь 2й параметр: КодировкаТекста.UTF8 (ну или может еще какая кодировка).
6 nikolas260579
 
19.05.17
14:54
(4)Как ты из браузера POST делаешь? Может GET?

В консоли - сеть, дальше вижу метод, там пост с 302 кодом. Делаю изменить и отправить. Там всё нормально отрабатывает, в location получаю нужную страницу.
7 nikolas260579
 
19.05.17
14:56
(4)%40 - точно проходит? Почему не @? Это в браузере %40 надо, а в строке 1С вроде @ разве не прокатывает. Не уверен правда.

Вообще вернуло одинаково. В редиректе ошибка 404.
8 nikolas260579
 
19.05.17
14:58
(4)надо:
Новый HTTPЗапрос("/",Заголовки) т.к. домен в Соединении уже есть.

А вот за это спасибо!!! А то я два дня туплю уже. Сработало!
9 nikolas260579
 
22.05.17
14:45
Подниму тему. Авторизация прошла нормально. Теперь на странице, куда меня перенаправило, мне нужно перейти на следующую закладку и нажать там кнопку формирования отчёта.

Делаю следующее: на той закладке, где кнопка формирования отчёта, делаю новое соединение:
Соединение = Новый HTTPСоединение("lk-ofd.taxcom.ru",443,"moeimya.familiya%40adres-pochty.ru","12345678",Прокси,120,ЗащищенноеСоединениеOpenSSL);

Затем выполняю GET-запрос (Куки я получил в заголовках ответа с пост-запроса авторизации:

ЗаголовкиGET = Новый Соответствие;
               ЗаголовкиGET.Вставить("Cookie", Куки);
               ЗаголовкиGET.Вставить("Content-Type", "application/x-www-form-urlencoded;");

URLЗапроса = Строка("/api/report/fiscaldocument/generate?outletId=&kktId=&beginDate="+ДатаНачала+"&endDate="+ДатаКонца+"&documentType=&accountingType=&paymentType=");//Строка("/spa/index#report/fiscaldocument");//
            
             GET_Запрос = Новый HTTPЗапрос(URLЗапроса,ЗаголовкиGET);
             Соединение.ВызватьHTTPМетод("GET",GET_Запрос,Файл);
            
             HTTPОтвет = Соединение.Получить(GET_Запрос,Файл);

и в коде состояния получаю 401 - не авторизован.


Нужно ли каждый раз на каждый запрос новое соединение? Нужно ли писать GET запрос при переходе на другую закладку на той странице, куда меня перенаправил пост-запрос? Я так думаю, что я где-то какую-то последовательность упустил, поэтому и получаю дальше 401 код?
10 oleg_km
 
22.05.17
17:56
(9) Не нужно. Просто формируй новый запрос и отправляй на обработку. Куки должны вроде сами сохраняться между запросами
11 nikolas260579
 
23.05.17
09:48
(9)Спасибо.

Сравнил куки запросов и ответов. Ответ с пост-запроса присылает Set-Cookie, в которых есть ид сессии и кук ASPXAUTH, который, я так думаю, и ответственный за авторизацию в пределах сессии. Если я его вытащу из ответа в виде строки и передам через Заголовки.Вставить("Cookie",МояСтрокаАвторизации), то он добавится к тем кукам, которые ходят между запросами?

Кук ид сессии, как я вижу в браузере, у меня сам сохраняется между запросами.
12 nikolas260579
 
23.05.17
12:15
разобрался, в Куки надо чистые куки из set-cookie передавать, без всяких частей и слэшей.