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