Autenticazione Qt HTTP con QNetworkAccessManager
-
11-09-2019 - |
Domanda
Sto lavorando con un servizio web che richiede un nome utente/password validi.Da PyQt, accedo al servizio web utilizzando QNetworkAccessManager che emette il file
authenticationRequired (QNetworkReply*, QAuthenticator*)
segnale quando (ovviamente) è richiesta l'autenticazione.Quando riempirò l'utente e PSSWD per Qauthenticator, tutto funziona bene.Tuttavia, non riesco a vedere come interrompere il ciclo quando l'utente lo è non valido.
Dai documenti per l'autenticazioneRichiesto:
"Se rifiuta le credenziali, questo segnale verrà emesso nuovamente."
Per le credenziali non valide, questo segnale viene emesso di nuovo, e ancora, e ancora ...Guardando il codice di errore nella risposta ho mostrato 0.Come dovrebbe essere interrotto o gestito questo ciclo in modo che termini con un errore?
Soluzione
Sì, è strano.Quello che ho fatto in precedenza è controllare se mi sono già autenticato con quei dettagli e se l'ho fatto, quindi chiamare QNetworkReply.abort()
Altri suggerimenti
Che dire di provare:
QNetworkReply::abort()
o
QNetworkReply::close()
QNetworkReply::abort()
Calling farà sì che la richiesta di fallire con l'errore 'Operazione interrotta' invece l'errore originale 401. La cosa giusta da fare ora sembra essere di non chiamare QAuthenticator::setUser()
o QAuthenticator::setPassword()
all'interno slot authenticationRequired()
. Questo lascerà la QAuthenticatorPrivate::phase
come Done
che farà sì che la richiesta per terminare in modo pulito con il codice di errore corretto.
La documentazione Qt è piuttosto chiaro su questo punto.
Questo non sembra essere il comportamento in Qt 4.7, ed è stato introdotto ad un certo punto in Qt 4.8.
Se si torna da una fessura collegata a & QNetworkAccessManager :: proxyAuthenticationRequired senza chiamare qualsiasi metodo QAuthenticator, la richiesta verrà interrotta con il codice vero e proprio HTTP (ad esempio 401 o 407).
Per esempio è possibile chiamare QAuthenticator :: setuser e setPassword quando i clics utente OK e chiamare nulla quando clics Cancel. Questo è tutto: -)
Questo è vero anche per gli slot collegato al & QNetworkAccessManager :: authenticationRequired (dove non c'è bisogno di chiamare QNetworkReply :: abort (), si può semplicemente chiamare nessun metodo QAuthenticator a tutti, che conserva il codice HTTP troppo, mentre chiamando abortire ( ) modificarlo).