Russian Qt Forum

Qt => Работа с сетью => Тема начата: Fatalist от Октябрь 09, 2009, 05:24



Название: Работа с куками.
Отправлено: Fatalist от Октябрь 09, 2009, 05:24
Народ, помогите, пожалуйста, сам что-то сообразить не могу.
Стоит задача залогиниться на сайте. При этом сайт для авторизации пользует куки.
Я так понимаю, что надо сделать POST-запрос, содержащий логин и пасс, и получить в ответ куку, которую потом необходимо сохранить.
Интересна реализация с помощью QWebView и без него, когда подключение реализовано через QNetworkAccessManager.
Очень надеюсь на вашу помощь.


Название: Re: Работа с куками.
Отправлено: SimpleSunny от Октябрь 09, 2009, 09:09
Если используется QNetworkAccessManager, то он сам находит в ответе Set-Cookie и устанавливает их, то есть от Вас никаких дополнительных телодвижений не надо.

Цитировать
QNetworkAccessManager by default does not implement any cookie policy of its own: it accepts all cookies sent by the server, as long as they are well formed and meet the minimum security requirements (cookie domain matches the request's and cookie path matches the request's). In order to implement your own security policy, override the QNetworkCookieJar::cookiesForUrl() and QNetworkCookieJar::setCookiesFromUrl() virtual functions. Those functions are called by QNetworkAccessManager when it detects a new cookie.


Название: Re: Работа с куками.
Отправлено: Fatalist от Октябрь 09, 2009, 17:56
А каким боком их тогда можно сохранить, чтобы при следующем подключении подсунуть хосту?


Название: Re: Работа с куками.
Отправлено: SimpleSunny от Октябрь 09, 2009, 20:32
Читать справку по QNetworkAccessManager.
>> QNetworkCookieJar * cookieJar () const


Название: Re: Работа с куками.
Отправлено: Fatalist от Октябрь 11, 2009, 16:12
С помощью WireShark сравниваю отсылаемые данные моей проги с тем, что отсылает ГугльХром. Понимаю, что мой POST-запрос составлен абсолютно неверно. Больше всего смущает строка:
Код:
Cookie: CAD=70991521%231255259845%230%230%23%230; T3E=%3D%3DANhNmM4MmZ4YDO6YDOzEjNyUTNyEjO1ATNygDO3oTMtojO6oDO2AjM5oDMjgjNwITOjgjNwITO\r\n
Как это задать через заголовок моего запроса найти не могу, маны читал, но, видать, знаний не хватает..


Название: Re: Работа с куками.
Отправлено: SimpleSunny от Октябрь 11, 2009, 16:38
1. Более правильный.
Код:
QNetworkAccessMAnager *manager;
manager->cookieJar()->setCookiesFromUrl(QList<QNetworkCookie>, QUrl("my_url"));
2. Менее правильный.
Код:
QNetworkRequest *request;
request->setRawHeader("Cookie", "CAD=122345; T3=abc");
manager->get(*request);


Название: Re: Работа с куками.
Отправлено: WaterProof от Февраль 01, 2011, 00:04
Сорь, что поднимаю сей баян, но такая штука: чтобы задать куки, использую setRawHeader. Задаю, отправляю запрос, проверяю через httpAnalyzer v5, и вижу что ничего и не задалось ни шиша. Собственно пробовал и так:
Код:
request.setRawHeader("Cookie", "someparameter=somevalue");
и так:
Код:
QList<QNetworkCookie> cookies;
cookies.append(QNetworkCookie("remixchk", "5"));
cookies.append(QNetworkCookie("remixsid", "someparameter"));
request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies));

Qt 4.7.1, MSVC. Подскажите, куда копать вообще...
ЗЫ. Делаю авторизацию десктоп приложения через апи вконтакте+задание прав без использования веб-браузера(как того требует вконтакте). Саму авторизацию сделал, а вот на задании прав споткнулся, ибо хоть убей не могу совладать с куками..  :-[


Название: Re: Работа с куками.
Отправлено: serg_hd от Февраль 06, 2011, 23:00
Странно, что не получается. Попробуй тогда использовать заранее подготовленный cookieJar с помощью метода
Код
C++ (Qt)
networkAccessManager()->setCookieJar(myCookieJar);
 
Некоторые моменты (http://www.prog.org.ru/topic_16206_0.html), которые, может быть, чем-то помогут.


Название: Re: Работа с куками.
Отправлено: SimpleSunny от Февраль 07, 2011, 01:12
Ничего удивительного, скорей всего, из-за того, что вы не убрали CookieJar (manager->setCookieJar(0)).

Код
C++ (Qt)
if (static_cast<QNetworkRequest::LoadControl>
       (request.attribute(QNetworkRequest::CookieLoadControlAttribute,
                          QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Automatic) {
       if (d->cookieJar) {
           QList<QNetworkCookie> cookies = d->cookieJar->cookiesForUrl(request.url());
           if (!cookies.isEmpty())
               request.setHeader(QNetworkRequest::CookieHeader, qVariantFromValue(cookies));
       }
   }
И он, CookieJar, перезаписывает ваши "сырые" куки


Название: Re: Работа с куками.
Отправлено: WaterProof от Февраль 07, 2011, 16:39
Спасибо за ответы, все получилось :)