Qt HTTP autenticação com QNetworkAccessManager
-
11-09-2019 - |
Pergunta
Eu estou trabalhando com um webservice que requer um nome de usuário / senha válidos. De PyQt, estou acessando o webservice usando QNetworkAccessManager que emite o
authenticationRequired (QNetworkReply*, QAuthenticator*)
sinal quando (obviamente), a autenticação é necessária. Quando eu preencher o usuário e psswd para QAuthenticator, tudo funciona bem. No entanto, eu não posso ver como quebrar o ciclo quando o usuário é não válido.
De docs para authenticationRequired:
"Se ele rejeita as credenciais, este sinal será emitido novamente."
Para credenciais inválidas este sinal é emitido novamente, e novamente, e de novo ... Olhando para o código de erro na resposta mostrou 0. Como esse ciclo deveria ser quebrado ou manipulado para que ele termina com um erro?
Solução
Yeh, é estranho. O que eu fiz anteriormente é verificar se eu já autenticado com esses detalhes e se eu tiver em seguida, chamar QNetworkReply.abort()
Outras dicas
Que tal tentar:
QNetworkReply::abort()
ou
QNetworkReply::close()
?
Chamando QNetworkReply::abort()
fará o pedido falhar com o erro 'Operação abortada' em vez do 401 erro original. A coisa certa a fazer agora parece ser para não chamar QAuthenticator::setUser()
ou QAuthenticator::setPassword()
dentro do seu slot de authenticationRequired()
. Isso vai deixar o QAuthenticatorPrivate::phase
como Done
que fará com que o pedido para terminar de forma limpa com o código de erro correto.
A documentação Qt é bastante claro neste ponto.
Este não parece ser o comportamento no Qt 4.7, e foi introduzida em algum ponto no Qt 4.8.
Se você retornar de um slot conectado a & QNetworkAccessManager :: proxyAuthenticationRequired sem chamar qualquer método QAuthenticator, o pedido será cancelado com o verdadeiro código HTTP (por exemplo, 401 ou 407).
Por exemplo, você pode chamar QAuthenticator :: setuser e setPassword quando o clics usuário OK e chamada nada quando ele clics Cancelar. Isso é tudo: -)
Isto também é verdade para entalhes ligados a & QNetworkAccessManager :: authenticationRequired (onde você não tem que chamar QNetworkReply :: abort (), você pode simplesmente chamar nenhum método QAuthenticator em tudo, que preservam HTTP código também, enquanto chamando abort ( ) alterá-lo).