QOAuthUriSchemeReplyHandler Class
处理私有/自定义以及 HTTPS URI 方案的重定向。更多...
| 标题: | #include <QOAuthUriSchemeReplyHandler> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS NetworkAuth) target_link_libraries(mytarget PRIVATE Qt6::NetworkAuth) |
| qmake: | QT += networkauth |
| 自: | Qt 6.8 |
| 继承自: | QOAuthOobReplyHandler |
属性
- redirectUrl : QUrl
公共函数
| QOAuthUriSchemeReplyHandler() | |
| QOAuthUriSchemeReplyHandler(QObject *parent) | |
| QOAuthUriSchemeReplyHandler(const QUrl &redirectUrl, QObject *parent = nullptr) | |
| virtual | ~QOAuthUriSchemeReplyHandler() override |
| void | close() |
(since 6.9) bool | handleAuthorizationRedirect(const QUrl &url) |
| bool | isListening() const |
| bool | listen() |
| QUrl | redirectUrl() const |
| void | setRedirectUrl(const QUrl &url) |
信号
| void | redirectUrlChanged() |
详细说明
该类作为OAuth 2.0授权流程的响应处理程序,适用于使用私有/自定义或 HTTPS URI 方案进行重定向的情况。它负责处理授权重定向(也称为回调)的接收,以及随后获取访问令牌的过程。
重定向 URI是授权服务器在授权流程完成后将用户代理(通常且最好是系统浏览器)重定向到的地址。
使用特定的 URI 方案需要在操作系统级别进行配置,以将 URI 与正确的应用程序关联起来。设置此关联的方法因操作系统而异。请参阅Platform Support and Dependencies 。
本类是对QOAuthHttpServerReplyHandler 的补充,后者通过设置本地主机服务器来处理http 方案。
以下代码演示了其用法。首先,定义所需的变量:
QOAuth2AuthorizationCodeFlow m_oauth;
QOAuthUriSchemeReplyHandler m_handler;随后是 OAuth 配置(为简洁起见,省略了错误处理):
m_oauth.setAuthorizationUrl(QUrl(authorizationUrl));
m_oauth.setTokenUrl(QUrl(accessTokenUrl));
m_oauth.setClientIdentifier(clientIdentifier);
m_oauth.setRequestedScopeTokens({scope});
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_handler.setRedirectUrl(QUrl{"com.example.myqtapp://oauth2redirect"_L1});
m_oauth.setReplyHandler(&m_handler);
// Initiate the authorization
if (m_handler.listen()) {
m_oauth.grant();
}私有/自定义 URI 方案
自定义 URI 方案通常采用反向域名表示法,后跟路径,有时也采用主机名/主机名+路径的形式:
// Example with path:
com.example.myapp:/oauth2/callback
// Example with host:
com.example.myapp://oauth2.callbackHTTPS URI 方案
对于 HTTPS URI 方案,重定向 URL 是标准的 https 链接:
https://myapp.example.com/oauth2/callback在 iOS 上,这些链接被称为“通用链接”(Universal Links),在 Android 上则称为“应用链接”(App Links)。
建议使用 HTTPS 方案,因为它通过强制应用开发者证明所用 URL 的所有权来提供额外的安全保障。这种证明是通过托管一个关联文件来实现的,操作系统会在其内部 URL 分发过程中参考该文件。
该文件的内容将应用程序与所使用的 URL 进行关联。关联文件必须可公开访问,且不得包含任何 HTTP 重定向。此外,托管站点必须拥有有效的证书,并且(至少在 Android 系统中)该文件必须以application/json 内容类型提供(请参阅您的服务器配置指南)。
此外,HTTPS 链接还能带来一些易用性优势:
- HTTPS URL 同时兼具普通 HTTPS 链接的功能。如果用户尚未安装该应用(因为该 URL 未被任何应用处理),HTTPS 链接可以提供安装说明等指引。
- 这样可以避免弹出用于打开该 URL 的应用选择对话框,而是直接自动打开您的应用
相应的权衡在于,这需要额外的配置工作,因为您需要设置此公开托管的关联文件。
平台支持与依赖项
当前支持的平台包括 Android、iOS 和 macOS。
URI 方案监听基于QDesktopServices::setUrlHandler() 和QDesktopServices::unsetUrlHandler()。这些功能目前由 Qt::Gui 模块提供,因此QtNetworkAuth 模块依赖于 Qt::Gui。如果QtNetworkAuth 在不包含 Qt::Gui 的情况下构建,则不会包含 QOAuthUriSchemeReplyHandler。
Android
在Android上,URI 方案需要:
- 在应用程序清单中配置intent-filters
- 可选:若要使用 https 方案进行自动验证,需托管一个站点关联文件assetlinks.json
另请参阅《Qt Android 清单文件配置》。
iOS 和 macOS
- 配置站点关联entitlement
- 对于 https 方案,需托管site association file (
apple-app-site-association)
Windows、Linux
目前不支持。不过,支持该功能的平台和使用场景 Qt WebEngine 的系统仍可使用此响应处理程序——详情请参阅《Qt OAuth2 浏览器支持》。
属性文档
redirectUrl : QUrl
该属性存储用于接收授权重定向/响应的 URL。
该属性用作OAuth2 的 `redirect_uri` 参数,该参数将作为授权请求的一部分发送。redirect_uri 是通过使用默认选项调用 `QUrl::toString()` 方法获取的。
该 URL 必须与在授权服务器上注册的 URL 一致,因为授权服务器很可能会拒绝任何不匹配的 redirect_uri。
同样地,当此处理程序接收重定向时,重定向 URL 必须与这里设置的 URL 匹配。处理程序会比较方案、主机、端口、路径以及由该方法设置的 URL 中包含的任何查询项。
只有当所有这些都匹配时,才会处理该 URL。查询参数的比较不包括可能在服务器端设置的任何额外查询参数,因为这些参数包含实际的感兴趣数据。
访问函数:
| QUrl | redirectUrl() const |
| void | setRedirectUrl(const QUrl &url) |
通知信号:
| void | redirectUrlChanged() |
成员函数文档
QOAuthUriSchemeReplyHandler::QOAuthUriSchemeReplyHandler()
创建一个 QOAuthUriSchemeReplyHandler 对象,其 `callback` 和 `redirectUrl` 均为空,且没有父对象。该对象不会自动监听。
[explicit] QOAuthUriSchemeReplyHandler::QOAuthUriSchemeReplyHandler(QObject *parent)
使用parent 以及空的callback()/redirectUrl() 构造一个 QOAuthUriSchemeReplyHandler 对象。该构造对象不会自动监听。
[explicit] QOAuthUriSchemeReplyHandler::QOAuthUriSchemeReplyHandler(const QUrl &redirectUrl, QObject *parent = nullptr)
创建一个 QOAuthUriSchemeReplyHandler 对象,并将parent 设为父对象,redirectUrl 设为重定向 URL。该对象会自动尝试监听。
另请参阅 redirectUrl()、setRedirectUrl()、listen() 和isListening()。
[override virtual noexcept] QOAuthUriSchemeReplyHandler::~QOAuthUriSchemeReplyHandler()
销毁QOAuthUriSchemeReplyHandler 对象。关闭此处理程序。
另请参阅 close()。
void QOAuthUriSchemeReplyHandler::close()
指示该处理程序停止监听传入的 URL。
另请参阅 listen() 和isListening()。
[since 6.9] bool QOAuthUriSchemeReplyHandler::handleAuthorizationRedirect(const QUrl &url)
此函数用于提供授权服务器在授权阶段结束时提供的重定向 URL。所提供的url 将经过与redirectUrl 中描述相同的 URL 匹配过程。
在某些场景下,提供该 URL 可能很有用,例如当该重定向 URL 通过其他方式被捕获时,比如 Qt WebEngine 或通过其他自定义安排。这样,此类代理的使用便可与 OAuth2 流程的其余部分集成。
该处理程序无需保持监听状态,因此建议调用close() 方法来关闭处理程序,以避免不必要的监听。
如果 URL 匹配且已被处理,则返回true ;否则返回false 。
另请参阅使用Qt WebEngine 的重定向 URI 方案。
该函数在 Qt 6.9 中引入。
[noexcept] bool QOAuthUriSchemeReplyHandler::isListening() const
如果该处理程序当前正在监听,则返回true ;否则返回false 。
bool QOAuthUriSchemeReplyHandler::listen()
指示该处理程序监听传入的 URL。若监听成功,则返回true ;否则返回false 。
该处理程序将通过redirectUrl() 函数对 URL 进行匹配。如果接收到的 URL 不匹配,则将其转发给 QDesktopServices::openURL()。
仅在执行初始授权阶段时才需要进行主动监听,该阶段通常由QOAuth2AuthorizationCodeFlow::grant() 调用触发。
建议在授权成功后关闭监听器。对于acquiring access tokens ,无需进行监听。
© 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.