HTTP-аутентификация Qt с помощью QNetworkAccessManager
-
11-09-2019 - |
Вопрос
Я работаю с веб-сервисом, для которого требуется действительное имя пользователя/пароль.Из PyQt я получаю доступ к веб-сервису с помощью QNetworkAccessManager, который выдает
authenticationRequired (QNetworkReply*, QAuthenticator*)
сигнал, когда (очевидно) требуется аутентификация.Когда я заполняю пользователя и PSSWD для Qauthenticator, все работает нормально.Однако я не вижу, как разорвать цикл, когда пользователь нет действительный.
Из документов для аутентификацииRequired:
«Если он отклонит учетные данные, этот сигнал будет отправлен снова».
Для недопустимых учетных данных этот сигнал снова испускается, и снова, и снова ...Просмотр кода ошибки в ответе показал 0.Как этот цикл следует прервать или обработать, чтобы он завершился с ошибкой?
Решение
Да, это странно.Ранее я проверил, прошел ли я уже аутентификацию с этими данными, и если прошел, то позвоню. QNetworkReply.abort()
Другие советы
А как насчет того, чтобы попробовать:
QNetworkReply::abort()
или
QNetworkReply::close()
?
Вызов QNetworkReply::abort()
приведет к сбою запроса с ошибкой «Операция прервана» вместо исходной ошибки 401.Кажется, сейчас правильнее не звонить. QAuthenticator::setUser()
или QAuthenticator::setPassword()
внутри твоего authenticationRequired()
слот.Это оставит QAuthenticatorPrivate::phase
как Done
что приведет к правильному завершению запроса с правильным кодом ошибки.
Документация Qt довольно неясна по этому поводу.
Похоже, такого поведения не было в Qt 4.7, и оно было введено в какой-то момент в Qt 4.8.
Если вы вернетесь из слота, подключенного к &QNetworkAccessManager::proxyAuthenticationRequired, без вызова какого-либо метода QAuthenticator, запрос будет прерван с использованием реального HTTP-кода (например,401 или 407).
Например, вы можете вызвать QAuthenticator::setUser и setPassword, когда пользователь нажимает «ОК», и ничего не вызывать, когда он нажимает «Отмена».Вот и все :-)
Это также верно для слотов, подключенных к &QNetworkAccessManager::authenticationRequired (где вам не нужно вызывать QNetworkReply::abort(), вы можете просто вообще не вызывать метод QAuthenticator, который также сохраняет HTTP-код, тогда как вызов abort() изменяет его ).