QOAuth2DeviceAuthorizationFlow Class
QOAuth2DeviceAuthorizationFlow 类提供了设备授权授予流程的实现。更多
Header: | #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 令牌,尤其是在缺乏用户代理或输入能力有限的设备上。这些设备包括电视、机器人机界面、电器和物联网设备。
设备流程可用于任何支持 SSL/TLS 请求的平台和操作系统。与QOAuth2AuthorizationCodeFlow 不同,该流程不基于重定向,因此不使用reply handler 。
设备流的使用
以下代码段说明了典型的使用方法。首先,我们设置流量的方法与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用户代码 QString用户代码, constQUrl&completeVerificationUrl) {if(completeVerificationUrl.isValid()) {// 如果授权服务器提供了一个完整的 URL // 该 URL 已包含作为 URL 参数一部分的必要数据,则 // 您可以选择使用该 URL。 qDebug() << "Complete verification uri:" << completeVerificationUrl; }else{// 授权服务器只提供了验证 URL;使用该 URL qDebug() << "Verification uri and usercode:" << verificationUrl << userCode; } } );
这一部分对流程至关重要,如何处理取决于具体的使用情况。无论如何,用户都需要完成授权。
设备流程没有定义完成授权的方式,因此它适用于不同的使用案例。这可以通过向用户显示验证 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 : const QUrl
该属性包含一个供用户完成授权的 URL。URL 本身包含user_code
,因此用户无需手动输入代码。不同授权服务器对该完整 URL 的支持各不相同。
访问功能:
QUrl | completeVerificationUrl() const |
通知信号:
void | completeVerificationUrlChanged(const QUrl &completeVerificationUrl) |
另请参阅 verificationUrl 和Device Flow Usage 。
[read-only]
polling : const bool
此属性表示流量是否主动轮询令牌。
访问功能:
bool | isPolling() const |
Notifier 信号:
void | pollingChanged(bool polling) |
另请参阅 startTokenPolling() 和stopTokenPolling()。
[read-only]
userCode : const QString
该属性保存授权响应中收到的user_code 代码。用户使用此代码完成授权。
访问功能:
QString | userCode() const |
Notifier 信号:
void | userCodeChanged(const QString &userCode) |
另请参阅 verificationUrl,completeVerificationUrl, 和Device Flow Usage 。
[read-only]
userCodeExpirationAt : const QDateTime
该属性保存用户代码和底层设备代码的本地过期时间。代码的有效期通常为 5 至 30 分钟。
访问功能:
QDateTime | userCodeExpirationAt() const |
通知信号:
void | userCodeExpirationAtChanged(const QDateTime &expiration) |
另请参阅 userCode 。
[read-only]
verificationUrl : const QUrl
该属性包含用户应输入用户代码以完成授权的 URL。
访问功能:
QUrl | verificationUrl() const |
Notifier 信号:
void | verificationUrlChanged(const QUrl &verificationUrl) |
成员函数文档
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().
该流程包括以下步骤:
- 向授权服务器发出授权请求
- 用户授权访问,参见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()。
© 2025 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.