|   |   | 
| 
 | 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 передавать, без всяких частей и слэшей.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |