QOAuthHttpServerReplyHandler Class
ローカルHTTPサーバーをセットアップすることで、ループバックリダイレクトを処理します。詳細...
| ヘッダー: | #include <QOAuthHttpServerReplyHandler> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS NetworkAuth) target_link_libraries(mytarget PRIVATE Qt6::NetworkAuth) |
| qmake: | QT += networkauth |
| 継承元: | QOAuthOobReplyHandler |
パブリック関数
| QOAuthHttpServerReplyHandler(QObject *parent = nullptr) | |
| QOAuthHttpServerReplyHandler(quint16 port, QObject *parent = nullptr) | |
| QOAuthHttpServerReplyHandler(const QHostAddress &address, quint16 port, QObject *parent = nullptr) | |
| virtual | ~QOAuthHttpServerReplyHandler() |
(since 6.9) QString | callbackHost() const |
| QString | callbackPath() const |
| QString | callbackText() const |
| void | close() |
| bool | isListening() const |
| bool | listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) |
| bool | listen(const QSslConfiguration &configuration, const QHostAddress &address = QHostAddress::Any, quint16 port = 0) |
| quint16 | port() const |
(since 6.9) void | setCallbackHost(const QString &host) |
| void | setCallbackPath(const QString &path) |
| void | setCallbackText(const QString &text) |
詳細な説明
このクラスは、ループバックリダイレクトを使用するOAuth 2.0認証プロセスの返信ハンドラとして機能します。
リダイレクトURIとは、フローの認証部分が完了した後、認証サーバーがユーザーエージェント(通常は、かつ望ましくはシステムのブラウザ)をリダイレクトする先のURIのことです。ループバックリダイレクトURIでは、スキームとしてhttp を使用し、ホストとしてlocalhostまたはIPアドレスのリテラルを使用します(IPv4 and IPv6 を参照)。
QOAuthHttpServerReplyHandler は、localhost サーバーを設定します。認証サーバーがブラウザをこの localhost アドレスにリダイレクトすると、リプライハンドラーはリダイレクト URI のクエリパラメータを解析し、a signal を使用して認証完了を通知します。
その他のリダイレクト URI スキームを処理するには、QOAuthUriSchemeReplyHandler を参照してください。
以下のコードは、その使用例を示しています。まず、必要な変数を定義します。
QOAuth2AuthorizationCodeFlow m_oauth;
QOAuthHttpServerReplyHandler *m_handler = nullptr;続いて、OAuthの設定を行います(簡潔にするため、エラー処理は省略しています):
m_oauth.setAuthorizationUrl(QUrl(authorizationUrl));
m_oauth.setTokenUrl(QUrl(accessTokenUrl));
m_oauth.setClientIdentifier(clientIdentifier);
m_oauth.setRequestedScopeTokens({scope});
m_handler = new QOAuthHttpServerReplyHandler(1234, this);
connect(&m_oauth, &QAbstractOAuth::authorizeWithBrowser, this, &QDesktopServices::openUrl);
connect(&m_oauth, &QAbstractOAuth::granted, this, [this]() {
// Here we use QNetworkRequestFactory to store the access token
m_api.setBearerToken(m_oauth.token().toLatin1());
m_handler->close();
});最後に、URIスキーマ「reply-handler」の設定を行います:
m_oauth.setReplyHandler(m_handler);
// Initiate the authorization
if (m_handler->isListening()) {
m_oauth.grant();
}IPv4 および IPv6
ハンドラが任意のアドレスハンドラ(AnyIPv4, AnyIPv6, or Any )である場合、使用されるコールバックはhttp://localhost:{port}/{path} という形式になります。ハンドラはまず IPv4 ループバックアドレスでリスンを試み、次に IPv6 でリスンを試みます。localhost が使用されるのは、これが IPv4 および IPv6 の両方のインターフェースで正しく解決されるためです。
ループバックアドレス(LocalHost or LocalHostIPv6 )の場合、IPリテラル(127.0.0.1 および::1 )が使用されます。
特定のIPアドレスの場合は、指定されたIPリテラルが直接使用されます。例えば、IPv4アドレスの場合はhttp://192.168.0.123:{port}/{path}となります。
また、setCallbackHost() を使用して、コールバック URL のホスト部分を手動で指定することも可能です。例えば、コールバックをlocalhost.localnet と指定できます。当然のことながら、リダイレクト時にそのアドレスにアクセスできることを確認する必要があります。
auto replyHandler = new QOAuthHttpServerReplyHandler(QHostAddress::LocalHost, 1337, this);
replyHandler->setCallbackHost("localhost.localnet"_L1);HTTP および HTTPS コールバック
Qt 6.9 以降では、ハンドラをhttp の代わりにhttps URI スキーマを使用するように設定できるようになりました。これは、listen() を呼び出す際に適切なQSslConfiguration を指定することで行います。内部的には、ハンドラはQSslServer を使用し、コールバック(リダイレクト URL)はhttps://{host}:{port}/{path} という形式になります。
以下の例がこれを示しています:
// 証明書と秘密鍵を読み込む
autocertificates=QSslCertificate::fromPath(sslCertificateFile);
QFile keyFile(sslPrivateKeyFile);
if(!keyFile.open(QFile::ReadOnly)) {
qWarning("Cannot open key file");
return;
}
QSslKey privateKey(&keyFile, QSsl::Rsa, QSsl::Pem);
if(certificates.size()== 0||privateKey.isNull()) {
qWarning("SSL certificate data invalid");
return;
}
// SSLの設定を作成する
QSslConfiguration configuration=QSslConfiguration::defaultConfiguration();
configuration.setLocalCertificate(certificates.at(0));
configuration.setPrivateKey(privateKey);
// SSL 設定を使用してハンドラをインスタンス化
m_handler= newQOAuthHttpServerReplyHandler(1234, this);
m_handler->listen(configuration);可能であれば、他のリダイレクト URI オプションを使用することをお勧めします。「応答ハンドラの選択」および「Qt OAuth2 ブラウザのサポート」を参照してください。
localhosthttps ハンドラの主な使用ケースは、開発段階、または厳重に管理・プロビジョニングされた環境に限定すべきです。例えば、一部の認証サーバーでは、http という形式のリダイレクト URI を一切許可しない場合があり、そのような場合には、この方法が開発の利便性を高めることができます。
セキュリティの観点からは、SSL/TLSを使用することでlocalhostのトラフィックは暗号化されますが、OAuth2にはPKCE などの他のセキュリティメカニズムも備わっています。いかなる状況においても、アプリケーションと一緒に秘密鍵を配布してはなりません。
注: 証明書が信頼されていない場合、ブラウザは 深刻な警告を表示します。これは自己署名証明書でよく見られる現象であり、その使用は開発時のみに限定すべきです。
メンバ関数のドキュメント
[explicit] QOAuthHttpServerReplyHandler::QOAuthHttpServerReplyHandler(QObject *parent = nullptr)
parent を親オブジェクトとして、QOAuthHttpServerReplyHandlerオブジェクトを構築します。ポート0 、アドレスLocalHost を指定して、listen()を呼び出します。
listen()も参照してください 。
[explicit] QOAuthHttpServerReplyHandler::QOAuthHttpServerReplyHandler(quint16 port, QObject *parent = nullptr)
parent を親オブジェクトとして、QOAuthHttpServerReplyHandlerオブジェクトを構築します。port およびアドレスLocalHost を引数として、listen() を呼び出します。
listen()も参照してください 。
[explicit] QOAuthHttpServerReplyHandler::QOAuthHttpServerReplyHandler(const QHostAddress &address, quint16 port, QObject *parent = nullptr)
parent を親オブジェクトとして、QOAuthHttpServerReplyHandlerオブジェクトを生成します。address およびport を引数として、listen()を呼び出します。
listen()も参照してください 。
[virtual noexcept] QOAuthHttpServerReplyHandler::~QOAuthHttpServerReplyHandler()
QOAuthHttpServerReplyHandler オブジェクトを破棄します。接続やリダイレクトの監視を停止します。
close()も参照してください 。
[since 6.9] QString QOAuthHttpServerReplyHandler::callbackHost() const
callback() /OAuth2 のredirect_uri パラメータのホストコンポーネントとして使用される名前を返します。
この関数は Qt 6.9 で導入されました。
setCallbackHost()も参照してください 。
QString QOAuthHttpServerReplyHandler::callbackPath() const
callback() /OAuth2 のredirect_uri パラメータのパス構成要素として使用されるパスを返します。
setCallbackPath()も参照してください 。
QString QOAuthHttpServerReplyHandler::callbackText() const
認証段階の終了時にリダイレクトの応答として使用されるテキストを返します。
このテキストは単純なHTMLページに埋め込まれ、リダイレクトを行ったブラウザ/ユーザーエージェントによってユーザーに表示されます。
デフォルトのテキストは
Callback received. Feel free to close this page.setCallbackText()も参照してください 。
void QOAuthHttpServerReplyHandler::close()
このハンドラーに対し、接続やリダイレクトの監視を停止するよう指示します。
listen()も参照してください 。
bool QOAuthHttpServerReplyHandler::isListening() const
このハンドラが現在リスニング中である場合は `true ` を返し、そうでない場合は `false ` を返します。
listen() およびclose()も参照してください 。
bool QOAuthHttpServerReplyHandler::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
このハンドラに対し、address およびport への着信接続/リダイレクトをリッスンするよう指示します。リッスンに成功した場合はtrue を返し、それ以外の場合はfalse を返します。
アクティブなリスニングが必要なのは、初期認証フェーズを実行する場合のみであり、通常はQOAuth2AuthorizationCodeFlow::grant() の呼び出しによって開始されます。
認証が成功した後は、リスナーを閉じることを推奨します。requesting access tokens の実行やその更新には、リスニングは必要ありません。
この関数がaddress としてNull を指定して呼び出された場合、ハンドラはLocalHost のリスニングを試み、それが失敗した場合はLocalHostIPv6 のリスニングを試みます。
IPv4 and IPv6 も参照してください。
close()、isListening()、およびQTcpServer::listen()も参照してください 。
bool QOAuthHttpServerReplyHandler::listen(const QSslConfiguration &configuration, const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
このハンドラに対し、address およびport へのhttps 接続/リダイレクトをリッスンするよう指示します。リッスンに成功した場合はtrue を返し、失敗した場合はfalse を返します。
詳細については、HTTP and HTTPS Callbacks を参照してください。
listen(const QHostAddress &, quint16)、close()、isListening()、QSslServer 、およびQTcpServer::listen()も参照してください 。
quint16 QOAuthHttpServerReplyHandler::port() const
このハンドラがリスニングしているポートを返します。それ以外の場合は 0 を返します。
listen() およびisListening()も参照してください 。
[since 6.9] void QOAuthHttpServerReplyHandler::setCallbackHost(const QString &host)
host を、callback() のホスト名コンポーネントとして使用するように設定します。host に空以外の値を指定すると、デフォルトの挙動が上書きされます。詳細はIPv4 and IPv6 を参照してください。
この関数は Qt 6.9 で導入されました。
callbackHost()も参照してください 。
void QOAuthHttpServerReplyHandler::setCallbackPath(const QString &path)
path を、callback() のパス構成要素として使用するように設定します。
callbackPath()も参照してください 。
void QOAuthHttpServerReplyHandler::setCallbackText(const QString &text)
認証段階の終了時のリダイレクトに対応するために、text を設定します。
callbackText()も参照してください 。
© 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.