Sur cette page

QOAuth2DeviceAuthorizationFlow Class

La classe `QOAuth2DeviceAuthorizationFlow` fournit une implémentation du flux d'autorisation par appareil. En savoir plus...

En-tête : #include <QOAuth2DeviceAuthorizationFlow>
CMake : find_package(Qt6 REQUIRED COMPONENTS NetworkAuth)
target_link_libraries(mytarget PRIVATE Qt6::NetworkAuth)
qmake : QT += networkauth
Depuis : Qt 6.9
Hérite de : QAbstractOAuth2

Propriétés

Fonctions publiques

QOAuth2DeviceAuthorizationFlow()
QOAuth2DeviceAuthorizationFlow(QObject *parent)
QOAuth2DeviceAuthorizationFlow(QNetworkAccessManager *manager, QObject *parent = nullptr)
virtual ~QOAuth2DeviceAuthorizationFlow() override
QUrl completeVerificationUrl() const
bool isPolling() const
QString userCode() const
QDateTime userCodeExpirationAt() const
QUrl verificationUrl() const

Emplacements publics

virtual void grant() override
bool startTokenPolling()
void stopTokenPolling()

Signaux

void authorizeWithUserCode(const QUrl &verificationUrl, const QString &userCode, const QUrl &completeVerificationUrl)
void completeVerificationUrlChanged(const QUrl &completeVerificationUrl)
void pollingChanged(bool polling)
void userCodeChanged(const QString &userCode)
void userCodeExpirationAtChanged(const QDateTime &expiration)
void verificationUrlChanged(const QUrl &verificationUrl)

Emplacements protégés

(since 6.9) void refreshTokensImplementation()

Description détaillée

Cette classe implémente le flux d’autorisation par appareil (Device Authorization Grant), qui sert à obtenir et à actualiser les jetons d’accès et les jetons d’identification, en particulier sur les appareils dépourvus d’agent utilisateur ou dotés de capacités de saisie limitées. Ces appareils comprennent les téléviseurs, les interfaces homme-machine (IHM) de machines, les appareils électroménagers et les appareils IoT.

Le flux « Device » peut être utilisé sur n’importe quelle plateforme et n’importe quel système d’exploitation capable de traiter des requêtes SSL/TLS. Contrairement au flux « QOAuth2AuthorizationCodeFlow », ce flux ne repose pas sur des redirections et n’utilise donc pas de « reply handler ».

Utilisation du flux « Device Flow »

Les extraits de code suivants illustrent une utilisation type. Tout d’abord, nous configurons le flux de la même manière que pour QOAuth2AuthorizationCodeFlow:

m_deviceFlow.setAuthorizationUrl(QUrl(authorizationUrl));
m_deviceFlow.setTokenUrl(QUrl(accessTokenUrl));
m_deviceFlow.setRequestedScopeTokens({scope});
m_deviceFlow.setClientIdentifier(clientIdentifier);
// The need for a client secret depends on the authorization server
m_deviceFlow.setClientIdentifierSharedKey(clientSecret);

Ensuite, nous nous connectons au signal authorizeWithUserCode pour gérer l’autorisation de l’utilisateur :

connect(&m_deviceFlow, &QOAuth2DeviceAuthorizationFlow::authorizeWithUserCode, this,
    [](const QUrl&verificationUrl, const QString&userCode, const QUrl&completeVerificationUrl) {
        if (completeVerificationUrl.isValid()) {
            // Si le serveur d'autorisation a fourni une URL complète
            // contenant déjà les données nécessaires dans les paramètres de l'URL,
            // vous pouvez choisir de l'utiliser
            qDebug() << "Complete verification uri:" << completeVerificationUrl;
        } else {
            // Le serveur d'autorisation n'a fourni qu'une URL de vérification ; utilisons celle-ci
            qDebug() << "Verification uri and usercode:" << verificationUrl << userCode;
        }
    }
);

Cette étape est cruciale pour le déroulement du processus, et la manière dont vous la gérez dépend de votre cas d’utilisation spécifique. D’une manière ou d’une autre, l’utilisateur doit finaliser l’autorisation.

Le flux « Device » ne définit pas la manière dont cette finalisation de l’autorisation s’effectue, ce qui le rend polyvalent pour différents cas d’utilisation. Cela peut se faire en affichant l’URI de vérification et le code utilisateur à l’utilisateur, qui peut ensuite y accéder depuis un autre appareil. Vous pouvez également présenter un code QR que l'utilisateur pourra scanner avec son appareil mobile, l'envoyer vers une application compagnon, l'envoyer par e-mail à l'utilisateur, etc.

Tant que l'autorisation est en attente, « QOAuth2DeviceAuthorizationFlow » interroge le serveur à intervalles réguliers (généralement toutes les 5 secondes) jusqu’à ce que l’utilisateur accepte ou refuse l’autorisation, après quoi le serveur répond en conséquence et le flux prend fin.

Les erreurs peuvent être détectées comme suit :

connect(&m_deviceFlow, &QAbstractOAuth::requestFailed, this, [](QAbstractOAuth::Error error) {
    Q_UNUSED(error);
    // Handle error
});

connect(&m_deviceFlow, &QAbstractOAuth2::serverReportedErrorOccurred, this,
    [](const QString &error, const QString &errorDescription, const QUrl &uri) {
        // Check server reported error details if needed
        Q_UNUSED(error);
        Q_UNUSED(errorDescription);
        Q_UNUSED(uri);
    }
);

QAbstractOAuth2::serverReportedErrorOccurredLe signal () permet d’obtenir des informations sur certaines erreurs définies par la norme RFC. Cependant, contrairement à QAbstractOAuth::requestFailed(), il ne couvre pas les erreurs telles que les erreurs réseau ou les erreurs de configuration du client.

La fin du flux est détectée de la même manière qu’avec ` QOAuth2AuthorizationCodeFlow`, par exemple :

connect(&m_deviceFlow, &QAbstractOAuth::granted, this, [this](){
    // Here we use QNetworkRequestFactory to store the access token
    m_api.setBearerToken(m_deviceFlow.token().toLatin1());
});
m_deviceFlow.grant();

Documentation sur les propriétés

[read-only] completeVerificationUrl : QUrl

Cette propriété contient une URL permettant à l'utilisateur de finaliser l'autorisation. L'URL elle-même contient le code « user_code », ce qui évite à l'utilisateur de devoir saisir ce code manuellement. La prise en charge de cette URL complète varie selon les serveurs d'autorisation.

Fonctions d'accès :

QUrl completeVerificationUrl() const

Signal de notification :

void completeVerificationUrlChanged(const QUrl &completeVerificationUrl)

Voir également verificationUrl et Device Flow Usage.

[read-only] polling : bool

Cette propriété indique si le flux effectue ou non une interrogation active des jetons.

Fonctions d'accès :

bool isPolling() const

Signal de notification :

void pollingChanged(bool polling)

Voir également startTokenPolling() et stopTokenPolling().

[read-only] userCode : QString

Cette propriété contient le code utilisateur reçu dans la réponse d'autorisation. Ce code est utilisé par l'utilisateur pour finaliser l'autorisation.

Fonctions d'accès :

QString userCode() const

Signal de notification :

void userCodeChanged(const QString &userCode)

Voir également verificationUrl, completeVerificationUrl et Device Flow Usage.

[read-only] userCodeExpirationAt : QDateTime

Cette propriété contient l'heure locale à laquelle le code utilisateur et les codes de l'appareil sous-jacent expirent. Les codes sont généralement valables entre 5 et 30 minutes.

Fonctions d’accès :

QDateTime userCodeExpirationAt() const

Signal de notification :

void userCodeExpirationAtChanged(const QDateTime &expiration)

Voir également userCode.

[read-only] verificationUrl : QUrl

Cette propriété contient l'URL à laquelle l'utilisateur doit saisir son code d'utilisateur pour finaliser l'autorisation.

Fonctions d'accès :

QUrl verificationUrl() const

Signal de notification :

void verificationUrlChanged(const QUrl &verificationUrl)

Voir également userCode, completeVerificationUrl et Device Flow Usage.

Documentation des fonctions membres

QOAuth2DeviceAuthorizationFlow::QOAuth2DeviceAuthorizationFlow()

Crée un objet QOAuth2DeviceAuthorizationFlow.

[explicit] QOAuth2DeviceAuthorizationFlow::QOAuth2DeviceAuthorizationFlow(QObject *parent)

Crée un objet `QOAuth2DeviceAuthorizationFlow` dont l'objet parent est ` parent`.

[explicit] QOAuth2DeviceAuthorizationFlow::QOAuth2DeviceAuthorizationFlow(QNetworkAccessManager *manager, QObject *parent = nullptr)

Crée un objet `QOAuth2DeviceAuthorizationFlow` en utilisant ` parent ` comme parent et définit ` manager ` comme gestionnaire d'accès au réseau.

[override virtual noexcept] QOAuth2DeviceAuthorizationFlow::~QOAuth2DeviceAuthorizationFlow()

Supprime l'instance de ` QOAuth2DeviceAuthorizationFlow `.

[signal] void QOAuth2DeviceAuthorizationFlow::authorizeWithUserCode(const QUrl &verificationUrl, const QString &userCode, const QUrl &completeVerificationUrl)

Ce signal est émis lorsque l'utilisateur doit finaliser l'autorisation.

Si le serveur d'autorisation a fourni l'URL completeVerificationUrl, l'utilisateur peut s'y rendre. Cette URL contient l'userCode nécessaire ainsi que tous les autres paramètres requis.

Sinon, l'utilisateur doit se rendre sur verificationUrl et saisir manuellement userCode.

Voir également Device Flow Usage.

[override virtual slot] void QOAuth2DeviceAuthorizationFlow::grant()

Réimplémente : QAbstractOAuth::grant().

Lance le flux d'autorisation tel que décrit dans le RFC « Device Grant ».

Le flux comprend les étapes suivantes :

  • Demande d'autorisation adressée au serveur d'autorisation
  • Autorisation de l'accès par l'utilisateur, voir authorizeWithUserCode()
  • Interrogation du serveur d'autorisation jusqu'à ce que l'utilisateur ait accepté ou refusé l'autorisation (ou que les codes aient expiré)
  • Communication du résultat à l'application (voir granted() et QAbstractOAuth::requestFailed())

Le flux passe automatiquement de l’autorisation à l’interrogation du jeton.

L'appel de cette fonction réinitialise toutes les données d'autorisation précédentes.

Voir également authorizeWithUserCode(), granted(), QAbstractOAuth::requestFailed(), polling, startTokenPolling(), stopTokenPolling() et Device Flow Usage.

[protected slot, since 6.9] void QOAuth2DeviceAuthorizationFlow::refreshTokensImplementation()

Cette fonction envoie une requête de rafraîchissement du jeton.

Si la demande de rafraîchissement a été lancée avec succès, l'état est défini sur « QAbstractOAuth::Status::RefreshingToken » ; dans le cas contraire, le signal « requestFailed()» est émis et l'état n'est pas modifié. Les jetons ne peuvent pas être rafraîchis tant que « isPolling » est défini sur « true ».

Cette fonction n'a aucun effet si le processus de rafraîchissement du jeton est déjà en cours.

Si l'actualisation du jeton échoue et qu'un jeton d'accès existe, l'état est défini sur QAbstractOAuth::Status::Granted, et sur QAbstractOAuth::Status::NotAuthenticated si aucun jeton d'accès n'existe.

Cette fonction a été introduite dans Qt 6.9.

Voir également QAbstractOAuth::requestFailed() et QAbstractOAuth2::refreshTokens().

[slot] bool QOAuth2DeviceAuthorizationFlow::startTokenPolling()

Lance l'interrogation des jetons. Renvoie true si le démarrage a réussi (ou si l'interrogation était déjà active), et false dans le cas contraire.

L'appel de cette fonction n'est pas nécessaire dans un cas d'utilisation typique. Une fois la demande d'autorisation terminée, à la suite de l'appel de grant(), l'interrogation est lancée automatiquement.

Cette fonction peut s’avérer utile dans les cas où il est nécessaire de reprendre (réessayer) l’interrogation du jeton un peu plus tard, sans redémarrer l’ensemble du flux d’autorisation. Par exemple, en cas de perte temporaire de connectivité réseau.

L’intervalle d’interrogation est défini par le serveur d’autorisation et est généralement de 5 secondes. La première requête d’interrogation est envoyée une fois ce premier intervalle écoulé.

Voir également polling, stopTokenPolling() et Device Flow Usage.

[slot] void QOAuth2DeviceAuthorizationFlow::stopTokenPolling()

Arrête l'interrogation des jetons. Toutes les requêtes d'interrogation éventuellement en attente sont ignorées sans message d'erreur.

Voir également polling et startTokenPolling().

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.