Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

HTTPСоединение и POST авторизация

HTTPСоединение и POST авторизация
Я
   oslokot
 
10.06.14 - 15:49
Не получается авторизоваться на страничке сайта.
Используется POST-авторизация. Подозреваю, что я наворочал с заголовками..
Вот код на примере мисты:


    АдресСервера = "dev.mista.ru";
    СтрокаЛогин = "user";
    СтрокаПароль = "pass";
    
    // Формирование заголовков запроса
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("POST /users.php HTTP/1.1");
    Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    Заголовки.Вставить("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.3");
    Заголовки.Вставить("Accept-Encoding", "gzip,deflate,sdch");
    Заголовки.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
    Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Заголовки.Вставить("Connection", "Keep-alive");
    Заголовки.Вставить("Host", АдресСервера);
    
    
    // Установка соединения с сервером
    Соединение = Новый HTTPСоединение(АдресСервера);
    
    // Далее, пытаюсь авторизоваться
    Запрос = Новый HTTPЗапрос("users.php?user_name="+СтрокаЛогин+"&user_password="+СтрокаПароль, Заголовки);
       Ответ = Соединение.ОтправитьДляОбработки(Запрос, ИмяФайлаЗапроса);
    
    // Теперь я хочу войти на страничку пользователя
    Запрос = Новый HTTPЗапрос("index.php?user_id=84363");
    Соединение.Получить(Запрос, ИмяВходящегоФайла);
    // ФИг там
    // В полученном файле "Страница доступна только зарегистрированным пользователям"



Что я делаю не так? Может есть у кого рабочие примеры?
 
 
   acsent
 
1 - 10.06.14 - 15:50
ты ему пост - он тебе куки,
Ты ему куки и гет - он тебе файл
   oslokot
 
2 - 10.06.14 - 15:54
(1) Заголовки ответа поста в гет? Пробовал, не получается. Так?:

    Запрос = Новый HTTPЗапрос("index.php?user_id=84363");
    Соединение.Получить(Запрос, ИмяВходящегоФайла, Ответ.Заголовки);
   oslokot
 
3 - 10.06.14 - 16:00
+ а, вот так наверное?
    Запрос = Новый HTTPЗапрос("index.php?user_id=84363", Ответ.Заголовки);

Но теперь требует размер запроса "411 Length Required"

Пробую перед запросом вставить
    Ответ.Заголовки.Вставить("Content-Length", 100);

Пофиг, не видит
   Dolphinbet
 
4 - 10.06.14 - 16:13
(3) а зачем все заголовки ответа передавать? нужно только куки
   oslokot
 
5 - 10.06.14 - 16:23
(4) пробовал подсовывать только полученные куки. Безрезультатно.

Есть у кого живой пример?
   Dolphinbet
 
6 - 10.06.14 - 18:01
(5) может сохранить в файл, вычислить размер файла и подставить полученное значение в Content-Length ?
   Bober
 
7 - 10.06.14 - 18:40
(0) как вариант посмотреть как это происходит в браузере по F12
   acsent
 
8 - 10.06.14 - 19:00
юзай фидлер и браузер
   Filin
 
9 - 10.06.14 - 20:36
Ну, насколько я понимаю, если у тебя  POST-авторизация, то логин и пароль надо передавать в теле запроса, а не в заголовках. То-есть фактически отправлять форму на сервер. Потом ты получишь ответ с куками, где будет сессия, и при использовании того-же соединения, просто отправляешь запросы. Куки, теоретически, должны ходить автоматом.
   oslokot
 
10 - 11.06.14 - 09:23
(8) о, спасибо! фидлер мне в помощь, а я и запамятовал.
 
 Рекламное место пустует
   oslokot
 
11 - 11.06.14 - 09:25
Позже отпишу о результате
   oslokot
 
12 - 17.06.14 - 10:21
Всем привет. Во всем разобрался. Все оказалось как всегда просто.
Если кому интересно, выкладываю свой код авторизации на примере мисты.ру

    // Убрать http-протоколы из доменного имени
    АдресСервера = СтрЗаменить(АдресСервера, "http://";, "");
    АдресСервера = СтрЗаменить(АдресСервера, "https://";, "");
    АдресСервера = СтрЗаменить(АдресСервера, "/", "");
    
    Соединение = Новый HTTPСоединение(АдресСервера);
    
    // Создать файлы запроса и получения
    ВремКаталог = КаталогВременныхФайлов() + "tempParser";
    СоздатьКаталог(ВремКаталог);
    УдалитьФайлы(ВремКаталог,"*.*");
    
    ИмяВыходногоФайла = "" + ВремКаталог + "\answer.html";
    ИмяФайлаОтправки = "" + ВремКаталог + "\request.html";
    
    // Подготовить файл для POST запроса
    POSTПараметры = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.UTF8,, Истина, Символы.ПС);
    POSTПараметры.Записать("user_name=" + Логин + "&user_password=" + Пароль + "&action=do_enter");
    POSTПараметры.Закрыть();

    // Определить заголовки POST, используя алгоритм "application/x-www-form-urlencoded"
    POSTЗаголовки = Новый Соответствие();
    POSTЗаголовки.Вставить("POST "+АдресСтраницыАвторизации+" HTTP/1.1");
    POSTЗаголовки.Вставить("Host", АдресСервера);
    POSTЗаголовки.Вставить("Referer", "http://";+АдресСервера);
    POSTЗаголовки.Вставить("Connection", "keep-alive");
    POSTЗаголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

    // Отправляем POST запрос
    Попытка
        ОтветHTTP = Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСтраницыАвторизации, ИмяВыходногоФайла, POSTЗаголовки);
    Исключение
        Сообщить("Неудачная попытка соединения с " + АдресСервера + ": " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Получим ресурс на который нас перебросил сервер
    Если ОтветHTTP.КодСостояния = 302 Тогда
        АдресСтраницы = ОтветHTTP.Заголовки["Location"];
    КонецЕсли;
    
    // Определить заголовки GET, с куками полученными от сервера
    GETЗаголовки = Новый Соответствие();
    GETЗаголовки.Вставить("Cookie", ОтветHTTP.Заголовки["Set-Cookie"]);
    GETЗаголовки.Вставить("Connection", "keep-alive");
    
    // Получаем страницу, указывая куки
    ОтветHTTP = Соединение.Получить(АдресСтраницыРассылки, ИмяВыходногоФайла, GETЗаголовки);

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует