このページでは

QOAuth2DeviceAuthorizationFlow Class

QOAuth2DeviceAuthorizationFlow クラスは、デバイス認証グラントフローの実装を提供します。詳細...

ヘッダー: #include <QOAuth2DeviceAuthorizationFlow>
CMake: find_package(Qt6 REQUIRED COMPONENTS NetworkAuth)
target_link_libraries(mytarget PRIVATE Qt6::NetworkAuth)
qmake: QT += networkauth
以下より: Qt 6.9
継承元: QAbstractOAuth2

プロパティ

パブリック関数

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

パブリックスロット

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

シグナル

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)

保護スロット

(since 6.9) void refreshTokensImplementation()

詳細な説明

このクラスは、特にユーザーエージェントを持たないデバイスや入力機能が限定的なデバイスにおいて、アクセストークンおよびIDトークンの取得や更新を行うために使用される「デバイス認証グラントフロー」を実装しています。こうしたデバイスには、テレビ、機械用HMI、家電製品、IoTデバイスなどが含まれます。

デバイスフローは、SSL/TLSリクエストが可能なあらゆるプラットフォームおよびオペレーティングシステムで使用できます。「QOAuth2AuthorizationCodeFlow 」とは異なり、このフローはリダイレクトに基づいていないため、reply handler は使用されません。

Device Flow の使用方法

以下のコードスニペットは、一般的な使用例を示しています。まず、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);

次に、ユーザーの認証処理を行うために、authorizeWithUserCode のシグナルに接続します:

connect(&m_deviceFlow, &QOAuth2DeviceAuthorizationFlow::authorizeWithUserCode, this,
    [](constQUrl&verificationUrl, constQString&userCode, constQUrl&completeVerificationUrl) {
        if(completeVerificationUrl.isValid()) {
            // 認証サーバーから提供された完全な URLに、
            // 必要なデータがURLパラメータの一部として既に含まれている 場合は 、
            // それを使用することもできます
            qDebug() << "Complete verification uri:" << completeVerificationUrl;
        }else{
            // 認証サーバーから提供されたのは検証用URLのみだったため、それを使用する
            qDebug() << "Verification uri and usercode:" << verificationUrl << userCode;
        }
    }
);

この部分はフローにおいて極めて重要であり、その処理方法は具体的なユースケースによって異なります。いずれにせよ、ユーザーは認証を完了させる必要があります。

Device Flowでは、この認証完了の具体的な方法が定義されていないため、さまざまなユースケースに柔軟に対応できます。これを実現するには、検証用URIとユーザーコードをユーザーに表示し、ユーザーが別のデバイスからそのページにアクセスできるようにする方法があります。 あるいは、ユーザーがモバイル端末でスキャンできるQRコードを表示したり、関連アプリに送信したり、ユーザーにメールで送信したりする方法もあります。

認証が保留中の間、QOAuth2DeviceAuthorizationFlow は、ユーザーが認証を承認または拒否するまで、一定の間隔(通常は5秒)でサーバーにポーリングを行います。ユーザーが承認または拒否すると、サーバーはそれに応じて応答し、フローは終了します。

エラーは次のように検出できます:

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::serverReportedErrorOccurred() シグナルを使用すると、RFC で定義された特定のエラーに関する情報を取得できます。ただし、QAbstractOAuth::requestFailed() とは異なり、ネットワークエラーやクライアントの設定エラーなどのエラーは対象外です。

フローの完了は、QOAuth2AuthorizationCodeFlow と同様に検出されます。例えば:

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();

プロパティのドキュメント

[read-only] completeVerificationUrl : QUrl

このプロパティには、ユーザーが認証を完了するためのURLが格納されています。URL自体にuser_code が含まれているため、ユーザーがコードを手動で入力する必要がありません。この完全なURLのサポート状況は、認証サーバーによって異なります。

アクセス関数:

QUrl completeVerificationUrl() const

通知シグナル:

void completeVerificationUrlChanged(const QUrl &completeVerificationUrl)

「 verificationUrl 」および「Device Flow Usage 」も参照してください 。

[read-only] polling : bool

このプロパティは、フローがトークンをアクティブにポーリングしているかどうかにかかわらず、常に真となります。

アクセス関数:

bool isPolling() const

Notifierシグナル:

void pollingChanged(bool polling)

startTokenPolling() およびstopTokenPolling()も参照してください 。

[read-only] userCode : QString

このプロパティには、認証応答で受け取ったuser_codeが格納されます。このコードは、ユーザーが認証を完了するために使用されます。

アクセス関数:

QString userCode() const

通知シグナル:

void userCodeChanged(const QString &userCode)

関連項目: verificationUrl 、completeVerificationUrl 、およびDevice Flow Usage 。

[read-only] userCodeExpirationAt : QDateTime

このプロパティには、ユーザーコードおよび基盤となるデバイスコードの有効期限が切れる現地時刻が格納されます。コードの有効期間は通常、5分から30分です。

アクセス機能:

QDateTime userCodeExpirationAt() const

通知シグナル:

void userCodeExpirationAtChanged(const QDateTime &expiration)

関連項目: userCode 。

[read-only] verificationUrl : QUrl

このプロパティには、ユーザーが認証を完了するためにユーザーコードを入力すべきURLが格納されます。

アクセス関数:

QUrl verificationUrl() const

通知シグナル:

void verificationUrlChanged(const QUrl &verificationUrl)

関連項目: userCode 、completeVerificationUrl 、およびDevice Flow Usage 。

メンバ関数のドキュメント

QOAuth2DeviceAuthorizationFlow::QOAuth2DeviceAuthorizationFlow()

QOAuth2DeviceAuthorizationFlow オブジェクトを作成します。

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

親オブジェクトparent を持つQOAuth2DeviceAuthorizationFlowオブジェクトを生成します。

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

parent を親としてQOAuth2DeviceAuthorizationFlowオブジェクトを生成し、manager をネットワークアクセスマネージャとして設定します。

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

QOAuth2DeviceAuthorizationFlow インスタンスを破棄します。

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

このシグナルは、ユーザーが認証を完了する必要がある場合に送信されます。

認証サーバーからcompleteVerificationUrl が提供されている場合、ユーザーはそのURLにアクセスできます。このURLには、必要なuserCode およびその他の必要なパラメータが含まれています。

あるいは、ユーザーはverificationUrl にアクセスし、userCode を手動で入力する必要があります。

「Device Flow Usage」も参照してください 。

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

QAbstractOAuth::grant() を再実装します。

Device Grant RFC に記載されているとおりに、認証フローを開始します。

このフローは以下のステップで構成されます:

  • 認証サーバーへの認証リクエスト
  • ユーザーによるアクセス承認(authorizeWithUserCode() を参照)
  • ユーザーが承認または拒否を行うまで(あるいはコードの有効期限が切れるまで)、認証サーバーをポーリングする
  • 結果をアプリケーションに通知する(granted() およびQAbstractOAuth::requestFailed() を参照)

フローは、認証からトークンのポーリングへと自動的に進行します。

この関数を呼び出すと、以前の認証データはすべてリセットされます。

authorizeWithUserCode()、granted()、QAbstractOAuth::requestFailed()、polling 、startTokenPolling()、stopTokenPolling()、およびDevice Flow Usageも参照してください 。

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

この関数は、トークンの更新リクエストを送信します。

更新要求が正常に開始された場合、ステータスはQAbstractOAuth::Status::RefreshingToken に設定されます。そうでない場合は、requestFailed()シグナルが発行され、ステータスは変更されません。isPolling がtrue である間は、トークンの更新を行うことはできません。

トークンの更新処理がすでに進行中の場合、この関数は何の効果も持ちません。

トークンの更新に失敗し、アクセストークンが存在する場合、ステータスはQAbstractOAuth::Status::Granted に設定され、アクセストークンが存在しない場合はQAbstractOAuth::Status::NotAuthenticated に設定されます。

この関数は Qt 6.9 で導入されました。

QAbstractOAuth::requestFailed() およびQAbstractOAuth2::refreshTokens()も参照してください 。

[slot] bool QOAuth2DeviceAuthorizationFlow::startTokenPolling()

トークンのポーリングを開始します。開始に成功した場合(またはすでにアクティブだった場合)は `true ` を返し、それ以外の場合は `false ` を返します。

一般的な使用ケースでは、この関数を呼び出す必要はありません。grant() の呼び出しの結果として認証リクエストが完了すると、ポーリングは自動的に開始されます。

この関数は、認証フロー全体を再起動することなく、少し遅れてトークンポーリングを再開(再試行)する必要がある場合に役立ちます。たとえば、一時的なネットワーク接続の切断が発生した場合などです。

ポーリング間隔は認証サーバーによって定義され、通常は 5 秒です。最初のポーリングリクエストは、最初の間隔が経過した時点で送信されます。

polling 、stopTokenPolling()、およびDevice Flow Usageも参照してください 。

[slot] void QOAuth2DeviceAuthorizationFlow::stopTokenPolling()

トークンのポーリングを停止します。未処理のポーリングリクエストがある場合は、それらは何も通知せずに破棄されます。

polling および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.