Загрузка файла по HTTPS с помощью QNetworkAccessManager: как пройти аутентификацию?

Общий ответ, который вы можете найти повсюду, состоит в том, чтобы использовать Signal authenticationRequired(QNetworkReply*, QAuthenticator*), а затем ввести учетные данные для входа в данный объект QAuthenticator.

Однако в моем случае это не работает, поскольку этот сигнал никогда не излучается. Причина: сервер не возвращает ошибку авторизации, а вместо этого перенаправляет меня на страницу входа. Так что моя программа просто загрузит эту страницу.

Я узнал, как это поймать, проверив атрибут QNetworkRequest::RedirectionTargetAttribute QNetworkReply. Таким образом, я могу обнаружить перенаправление и запросить у пользователя информацию об авторизации.

Но... куда мне идти оттуда? Как установить данные аутентификации? Могу ли я вручную установить QAuthenticator для моего QNetworkRequest или моего QNetworkAccessManager? Я нигде не нашел способа сделать это, только через вышеупомянутый механизм сигнала/слота, который не работает, потому что он не срабатывает.

Любая помощь будет принята с благодарностью!


person user3782412    schedule 14.07.2014    source источник


Ответы (1)


Из документации,

http://qt-project.org/doc/qt-5/qauthenticator.html

QAuthenticator поддерживает следующие методы аутентификации:

  • Базовый
  • НТЛМ версии 2
  • Дайджест-MD5

Поскольку вас перенаправляют на страницу входа, и вы не указали, работает ли какой-либо из вышеперечисленных методов аутентификации, я предполагаю, что это не так, потому что такие вещи, как обычная аутентификация, отправляются при каждом запросе. на сервер. Страницы входа обычно аутентифицируют клиента и используют какой-то файл cookie для будущей аутентификации. Сделать это,

  1. Обнаружить страницу входа
  2. Передайте правильные учетные данные на сервер (в зависимости от того, что хочет форма)
  3. В QNetworkReply на странице входа найдите файлы cookie (заголовки Set-Cookie).
  4. Передайте соответствующие файлы cookie вместе с вашими запросами.
  5. Если это работает, вы больше не перенаправляетесь на страницу входа.

Для получения информации о файлах cookie вы можете получить обзор через Википедию, но для реализации вам необходимо посмотрите RFC 6265,

Если это неверно, и вы можете использовать обычную аутентификацию, то эта информация передается в самом URL-адресе. Установите имя пользователя и пароль в своем QUrl, и если это сработает, вы не будете перенаправлены. http://qt-project.org/doc/qt-5/qurl.html#setPassword

person user3427419    schedule 15.07.2014
comment
Спасибо за ответ. Я думаю, я мог бы создать что-то, что вы предлагаете, для one сервера и формы входа (2. Передать правильные учетные данные на сервер в зависимости от того, что хочет форма). Но это не совсем удовлетворительное решение, так как я хочу, чтобы оно работало с любым https-соединением. Что касается методов аутентификации: я пытался просто пройти обычную аутентификацию с URL-адресом, который не работает. Что касается NTLM 2 и Digest-MD5, я даже не знаю ... Я не могу попробовать, потому что у меня нет возможности передать свою информацию для аутентификации на сервер. - person user3782412; 15.07.2014
comment
Хорошо, в итоге я сделал почти то, что вы предложили, за исключением того, что вместо того, чтобы выполнять POST на сервер с необходимыми учетными данными для входа, что было бы трудно сделать, потому что этот POST должен был быть адаптирован специально для потребности страницы входа - я использую QWebView (с прикрепленным моим QNetworkAccessManager), чтобы просто отобразить саму страницу входа. Пользователь должен войти в систему, после чего я могу получить файл cookie из QNetworkCookieJar диспетчера доступа и передать его вместе с новым запросом на загрузку. Это должно работать практически на любой странице, потому что я использую оригинальный механизм входа в систему. В очередной раз благодарим за помощь! - person user3782412; 16.07.2014