本页内容

QAbstractOAuth2 Class

QAbstractOAuth2 类是所有 OAuth 2 身份验证方法实现的基础。更多内容...

头文件: #include <QAbstractOAuth2>
CMake: find_package(Qt6 REQUIRED COMPONENTS NetworkAuth)
target_link_libraries(mytarget PRIVATE Qt6::NetworkAuth)
qmake: QT += networkauth
继承自: QAbstractOAuth
继承自:

QOAuth2AuthorizationCodeFlow 以及QOAuth2DeviceAuthorizationFlow

公共类型

(since 6.9) enum class NonceMode { Automatic, Enabled, Disabled }

属性

公共函数

QAbstractOAuth2(QObject *parent = nullptr)
QAbstractOAuth2(QNetworkAccessManager *manager, QObject *parent = nullptr)
virtual ~QAbstractOAuth2()
bool autoRefresh() const
void clearNetworkRequestModifier()
QString clientIdentifierSharedKey() const
virtual QUrl createAuthenticatedUrl(const QUrl &url, const QVariantMap &parameters = QVariantMap())
QDateTime expirationAt() const
QSet<QByteArray> grantedScopeTokens() const
QString idToken() const
QString nonce() const
QAbstractOAuth2::NonceMode nonceMode() const
std::chrono::seconds refreshLeadTime() const
QString refreshToken() const
QSet<QByteArray> requestedScopeTokens() const
QString responseType() const
QString scope() const
void setAutoRefresh(bool enable)
void setClientIdentifierSharedKey(const QString &clientIdentifierSharedKey)
(since 6.9) void setNetworkRequestModifier(const QAbstractOAuth2::ContextTypeForFunctor<Functor> *context, Functor &&callback)
void setNonce(const QString &nonce)
void setNonceMode(QAbstractOAuth2::NonceMode mode)
void setRefreshLeadTime(std::chrono::seconds leadTime)
void setRefreshToken(const QString &refreshToken)
void setRequestedScopeTokens(const QSet<QByteArray> &tokens)
void setScope(const QString &scope)
(since 6.5) void setSslConfiguration(const QSslConfiguration &configuration)
void setState(const QString &state)
void setTokenUrl(const QUrl &tokenUrl)
void setUserAgent(const QString &userAgent)
(since 6.5) QSslConfiguration sslConfiguration() const
QString state() const
QUrl tokenUrl() const
QString userAgent() const

重新实现的公共函数

(deprecated in 6.11) virtual QNetworkReply *deleteResource(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override
(deprecated in 6.11) virtual QNetworkReply *get(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override
(deprecated in 6.11) virtual QNetworkReply *head(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override
(deprecated in 6.11) virtual QNetworkReply *post(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override
virtual void prepareRequest(QNetworkRequest *request, const QByteArray &verb, const QByteArray &body = QByteArray()) override
(deprecated in 6.11) virtual QNetworkReply *put(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override

公共插槽

(since 6.9) void refreshTokens()

信号

(since 6.9) void accessTokenAboutToExpire()
void authorizationCallbackReceived(const QVariantMap &data)
void autoRefreshChanged(bool enable)
void clientIdentifierSharedKeyChanged(const QString &clientIdentifierSharedKey)
(until 6.13) void error(const QString &error, const QString &errorDescription, const QUrl &uri)
void expirationAtChanged(const QDateTime &expiration)
void grantedScopeTokensChanged(const QSet<QByteArray> &tokens)
void idTokenChanged(const QString &idToken)
void nonceChanged(const QString &nonce)
void nonceModeChanged(QAbstractOAuth2::NonceMode mode)
void refreshLeadTimeChanged(std::chrono::seconds leadTime)
void refreshTokenChanged(const QString &refreshToken)
void requestedScopeTokensChanged(const QSet<QByteArray> &tokens)
void scopeChanged(const QString &scope)
(since 6.9) void serverReportedErrorOccurred(const QString &error, const QString &errorDescription, const QUrl &uri)
(since 6.5) void sslConfigurationChanged(const QSslConfiguration &configuration)
void stateChanged(const QString &state)
void tokenUrlChanged(const QUrl &tokenUrl)
void userAgentChanged(const QString &userAgent)

受保护的槽

(since 6.9) void refreshTokensImplementation()

详细说明

该类定义了 OAuth 2 身份验证类的基本接口。通过继承该类,您可以基于 OAuth 2 标准为不同的 Web 服务创建自定义身份验证方法。

有关 OAuth 2 工作原理的说明,请参阅:《OAuth 2.0 授权框架》

成员类型文档

[since 6.9] enum class QAbstractOAuth2::NonceMode

可用非ce模式列表。

常量值描述
QAbstractOAuth2::NonceMode::Automatic0如果requested scope 包含openid ,则会发送Nonce。这是默认模式,仅在与OIDC身份验证流程相关时才发送nonce 。
QAbstractOAuth2::NonceMode::Enabled1在授权阶段发送非ce。
QAbstractOAuth2::NonceMode::Disabled2在授权阶段不发送 Nonce。这将禁用 OpenID Connectid_token 的重放保护。

此枚举类型在 Qt 6.9 中引入。

另请参阅 nonce 和OAuth 2.0 概述。

属性文档

[since 6.9] autoRefresh : bool

此属性用于启用或禁用访问令牌的自动刷新。

此属性用于启用或禁用访问令牌的自动刷新。对于需要持续授权且无需用户干预的应用程序,此功能非常有用。

如果该属性设置为true ,则当令牌即将过期且存在有效的refreshToken 时,将自动调用refreshTokens()。

该枚举在 Qt 6.9 中引入。

访问函数:

bool autoRefresh() const
void setAutoRefresh(bool enable)

通知信号:

void autoRefreshChanged(bool enable)

另请参阅 refreshLeadTime 和accessTokenAboutToExpire()。

clientIdentifierSharedKey : QString

如果服务器要求在请求令牌时进行身份验证,则此属性将存储用作密码的客户端共享密钥。

访问函数:

QString clientIdentifierSharedKey() const
void setClientIdentifierSharedKey(const QString &clientIdentifierSharedKey)

通知器信号:

void clientIdentifierSharedKeyChanged(const QString &clientIdentifierSharedKey)

[read-only] expiration : QDateTime

该属性存储了当前访问令牌的过期时间。无效值表示授权服务器未提供有效的过期时间。

访问函数:

QDateTime expirationAt() const

通知信号:

void expirationAtChanged(const QDateTime &expiration)

另请参阅 QDateTime::isValid()。

[read-only, since 6.9] grantedScopeTokens : QSet<QByteArray>

该属性包含授权服务器授予的权限范围。

请求的范围与授予的范围可能不同。最终用户可能选择仅授予范围的一部分,或者服务器端策略可能对其进行了调整。应用程序应做好处理此类情况的准备,并检查授予的范围以确定其是否会影响应用程序逻辑。

根据RFC 6749 的定义,服务器可能会完全省略授予范围的指示。在这种情况下,实现将假定授予范围与请求范围相同。

此枚举类型在 Qt 6.9 中引入。

访问函数:

QSet<QByteArray> grantedScopeTokens() const

通知信号:

void grantedScopeTokensChanged(const QSet<QByteArray> &tokens)

另请参阅 QAbstractOAuth2::requestedScopeTokens 。

[read-only, since 6.9] idToken : QString

该属性存储接收到的OpenID Connect ID 令牌。

该枚举在 Qt 6.9 中引入。

访问函数:

QString idToken() const

通知信号:

void idTokenChanged(const QString &idToken)

另请参阅 NonceMode 、nonce 以及Qt OpenID Connect 支持文档。

[since 6.9] nonce : QString

该属性存储在身份验证过程中发送至服务器的字符串。该随机数(nonce)用于将相应的令牌响应(特别是 OpenID Connect 的“id_token ”)与授权阶段建立关联。

nonce 的主要目的是防范重放攻击。它确保收到的令牌响应确实是对应用程序发起的身份验证请求的响应,从而防止攻击者在未经授权的上下文中重复使用令牌。因此,将 nonce 验证纳入令牌验证流程至关重要。

实际上,如果授权请求中未提供非ce,授权服务器供应商可能会拒绝该 OpenID Connect 请求。

令牌本身是一个不透明字符串,为确保最大兼容性,其内容应仅包含 URL 安全字符。此外,令牌必须具备足够熵值,以确保攻击者无法猜出。nonce 没有严格的大小限制,授权服务器供应商可能会规定自己的最小和最大长度。

虽然可以手动设置nonce ,但如果未设置,Qt类将生成一个32个字符的随机数when needed 。

此枚举类型在 Qt 6.9 中引入。

访问函数:

QString nonce() const
void setNonce(const QString &nonce)

通知信号:

void nonceChanged(const QString &nonce)

另请参阅 ` nonceMode ` 和Qt OpenID Connect 支持。

[since 6.9] nonceMode : NonceMode

该属性保存当前的随机数模式(是否使用随机数)。

该枚举在 Qt 6.9 中引入。

访问函数:

QAbstractOAuth2::NonceMode nonceMode() const
void setNonceMode(QAbstractOAuth2::NonceMode mode)

通知器信号:

void nonceModeChanged(QAbstractOAuth2::NonceMode mode)

另请参阅 NonceMode 和nonce 。

[since 6.9] refreshLeadTime : std::chrono::seconds

该属性定义了在访问令牌过期之前,accessTokenAboutToExpire() 信号会提前多久发出。

该属性指定在当前访问令牌过期前,何时(以秒为单位)发出accessTokenAboutToExpire() 信号。该属性的值必须为正数。

该时间间隔允许应用程序提前刷新令牌,从而确保授权过程持续进行且不会中断。

如果未显式设置此属性,或者提供的 leadTime 大于令牌的有效期,则 leadTime 默认为令牌剩余有效期的 5%,但不得少于到期前 10 秒(以便留出时间完成刷新请求)。

注意:Expiration 信号仅在授权服务器提供了正确的过期时间时才有效。

此枚举在 Qt 6.9 中引入。

访问函数:

std::chrono::seconds refreshLeadTime() const
void setRefreshLeadTime(std::chrono::seconds leadTime)

Notifier 信号:

void refreshLeadTimeChanged(std::chrono::seconds leadTime)

另请参阅 autoRefresh 。

refreshToken : QString

该属性存储用于获取新访问令牌的刷新令牌。

刷新令牌的有效期通常比访问令牌更长,因此将其保存以备后用是合理的。

访问函数:

QString refreshToken() const
void setRefreshToken(const QString &refreshToken)

通知器信号:

void refreshTokenChanged(const QString &refreshToken)

另请参阅 setRefreshToken()。

[since 6.9] requestedScopeTokens : QSet<QByteArray>

该属性包含所需的范围,该范围定义了客户端请求的权限。

注意:作用域 令牌仅限于 US-ASCII 可打印字符的子集。不支持使用此范围之外的字符。

该枚举在 Qt 6.9 中引入。

访问函数:

QSet<QByteArray> requestedScopeTokens() const
void setRequestedScopeTokens(const QSet<QByteArray> &tokens)

通知信号:

void requestedScopeTokensChanged(const QSet<QByteArray> &tokens)

另请参阅 QAbstractOAuth2::grantedScopeTokens 。

[until 6.13] scope : QString

该枚举计划在 6.13 版本中被废弃。

请改用requestedScopeTokens 和grantedScopeTokens 属性。该属性将在Qt 7中被移除。

该属性保存了所需的作用域,该作用域定义了客户端请求的权限。

作用域值将更新为授权服务器授予的作用域值。如果响应的作用域为空,则请求的作用域被视为已授予,且不会改变。

该属性同时承担“请求范围”和“授予范围”两种不同角色,实为历史遗留问题。建议所有新代码均使用QAbstractOAuth2::requestedScopeTokens 和QAbstractOAuth2::grantedScopeTokens 。

访问函数:

QString scope() const
void setScope(const QString &scope)

通知器信号:

void scopeChanged(const QString &scope)

另请参阅 QAbstractOAuth2::grantedScopeTokens 和QAbstractOAuth2::requestedScopeTokens 。

state : QString

该属性保存认证过程中发送给服务器的字符串。当收到回调时,该状态用于识别和验证请求。

如果在授权流程开始时未设置状态,系统会自动生成一个由 32 个字符组成的随机状态。这是默认且推荐的做法。

该状态是防范跨站请求伪造(CSRF)的主要保护措施,因此应包含足够的随机性。若您手动设置,请确保使用至少 32 个随机字符。

状态元素中某些字符是不允许的(参见RFC 6749)。使用非法字符可能会导致意外的状态不匹配,从而导致 OAuth 2 授权失败。因此,如果您尝试设置包含非法字符的值,该状态将被忽略,并记录一条警告。

访问函数:

QString state() const
void setState(const QString &state)

通知器信号:

void stateChanged(const QString &state)

[since 6.9] tokenUrl : QUrl

该属性存储用于获取令牌的令牌端点 URL。根据具体用例和授权服务器的支持情况,这些令牌可以是访问令牌、刷新令牌和身份令牌。

令牌通常在授权阶段完成后获取,且令牌端点也可用于根据需要刷新令牌。

例如,QOAuth2AuthorizationCodeFlow 使用此 URL 发出访问令牌请求,而QOAuth2DeviceAuthorizationFlow 使用此 URL轮询获取访问令牌。

此枚举在 Qt 6.9 中引入。

访问函数:

QUrl tokenUrl() const
void setTokenUrl(const QUrl &tokenUrl)

通知器信号:

void tokenUrlChanged(const QUrl &tokenUrl)

userAgent : QString

该属性存储用于创建网络请求的 User-Agent 头。

默认值为“QtOAuth/1.0 (+https://www.qt.io)”。

访问函数:

QString userAgent() const
void setUserAgent(const QString &userAgent)

通知器信号:

void userAgentChanged(const QString &userAgent)

成员函数文档

[explicit] QAbstractOAuth2::QAbstractOAuth2(QObject *parent = nullptr)

使用parent 作为父类,构建一个QAbstractOAuth2对象。

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

使用parent 作为父类创建一个QAbstractOAuth2对象,并将manager 设置为网络访问管理器。

[virtual noexcept] QAbstractOAuth2::~QAbstractOAuth2()

销毁该QAbstractOAuth2 实例。

[signal, since 6.9] void QAbstractOAuth2::accessTokenAboutToExpire()

当访问令牌即将过期时,会发出该信号。

触发此信号的前提是访问令牌具有有效的过期时间。若需手动处理此信号,可使用autoRefresh 。

该函数于 Qt 6.9 中引入。

另请参阅 refreshLeadTime 、autoRefresh 以及refreshTokens()。

[signal] void QAbstractOAuth2::authorizationCallbackReceived(const QVariantMap &data)

当响应服务器收到来自服务器的授权回调时发出的信号:data 包含从服务器接收到的值。

void QAbstractOAuth2::clearNetworkRequestModifier()

清除网络请求修饰符。

另请参阅 setNetworkRequestModifier()。

[virtual invokable] QUrl QAbstractOAuth2::createAuthenticatedUrl(const QUrl &url, const QVariantMap &parameters = QVariantMap())

返回的 URL 基于url ,将其与给定的parameters 以及访问令牌相结合。

注意: 可通过元对象系统以及从 QML 中调用此 函数。请参阅Q_INVOKABLE 。

[signal, until 6.13] void QAbstractOAuth2::error(const QString &error, const QString &errorDescription, const QUrl &uri)

该函数计划在 6.13 版本中被废弃。

请改用serverReportedErrorOccurred

当授权服务器在处理授权或令牌请求(包括令牌刷新请求)时报告错误,会触发此信号,具体定义参见RFC 6749 中的错误响应。

error 是错误的名称;errorDescription 描述了该错误,而uri 是一个可选的URI,其中包含有关该错误的更多信息。

另请参阅 QAbstractOAuth::requestFailed() 和QAbstractOAuth2::serverReportedErrorOccurred()。

[override virtual] void QAbstractOAuth2::prepareRequest(QNetworkRequest *request, const QByteArray &verb, const QByteArray &body = QByteArray())

重写了:QAbstractOAuth::prepareRequest (QNetworkRequest *request, const QByteArray &verb, const QByteArray &body)。

QString QAbstractOAuth2::refreshToken() const

获取当前的刷新令牌。

刷新令牌的有效期通常比访问令牌更长,因此将其保存以备后用是合理的。

返回当前的刷新令牌;如果没有可用的刷新令牌,则返回空字符串。

注意: 这是 refreshToken 属性的获取 函数。

另请参阅 setRefreshToken()。

[slot, since 6.9] void QAbstractOAuth2::refreshTokens()

调用此函数可刷新令牌。该函数会调用refreshTokensImplementation() 来执行实际的刷新操作。

该函数在 Qt 6.9 中引入。

另请参阅 refreshTokensImplementation() 和autoRefresh 。

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

该插槽由refreshTokens()调用,用于发送令牌刷新请求。

派生类应重写此槽以支持令牌刷新:

classMyClass :publicQAbstractOAuth2
{
    ...
protectedQ_SLOTS:
    voidrefreshTokensImplementation() QT7_ONLY(override);
};

voidMyClass::refreshTokensImplementation()
{
    qDebug("refresh");
}

该函数在 Qt 6.9 中引入。

另请参阅 autoRefresh 和accessTokenAboutToExpire()。

QString QAbstractOAuth2::responseType() const

返回所使用的response_type。

[signal, since 6.9] void QAbstractOAuth2::serverReportedErrorOccurred(const QString &error, const QString &errorDescription, const QUrl &uri)

当授权服务器在处理授权或令牌请求(包括令牌刷新请求)时报告错误,会发出此信号,具体定义参见RFC 6749 中的错误响应。

error 是错误的名称;errorDescription 描述了该错误,而uri 是一个可选的 URI,其中包含有关该错误的更多信息。

若要通过单个信号捕获所有错误(包括这些 RFC 定义的错误),请使用QAbstractOAuth::requestFailed()。

该函数在 Qt 6.9 中引入。

[since 6.9] template <typename Functor> requires if_compatible_callback<Functor> void QAbstractOAuth2::setNetworkRequestModifier(const QAbstractOAuth2::ContextTypeForFunctor<Functor> *context, Functor &&callback)

将网络请求修改函数设置为callback 。该函数用于自定义发送到服务器的网络请求。

callback 必须实现void(QNetworkRequest&, QAbstractOAuth::Stage) 接口。提供的QNetworkRequest 参数可直接修改,且会在回调函数执行完成后立即被使用。callback 可以是函数指针、lambda表达式、成员函数或任何可调用的对象。提供的QAbstractOAuth::Stage 参数可用于检查请求所属的阶段(令牌请求、令牌刷新请求,或在QOAuth2DeviceAuthorizationFlow 情况下为授权请求)。

context 控制调用的生命周期,并在context 被销毁时防止访问已释放的资源。 换言之,如果作为上下文提供的对象被销毁,回调将不会被执行。context 必须指向一个有效的QObject (如果回调是一个成员函数,则该类必须实际包含该函数)。由于回调的结果会被立即使用,因此context 必须位于与QAbstractOAuth2 实例相同线程中。

该函数于 Qt 6.9 版本中引入。

另请参阅 clearNetworkRequestModifier() 和QNetworkRequest。

void QAbstractOAuth2::setRefreshToken(const QString &refreshToken)

将新刷新令牌refreshToken 设置为待用令牌。

可以使用自定义刷新令牌通过此方法刷新访问令牌,随后可通过refreshTokens() 刷新访问令牌。

注意: 这是属性refreshToken 的设置 函数。

另请参阅 refreshToken()。

[since 6.5] void QAbstractOAuth2::setSslConfiguration(const QSslConfiguration &configuration)

设置在客户端与授权服务器之间建立双向 TLS 连接时所使用的 TLSconfiguration 。

该函数在 Qt 6.5 中引入。

另请参阅 sslConfiguration() 和sslConfigurationChanged()。

[since 6.5] QSslConfiguration QAbstractOAuth2::sslConfiguration() const

返回在客户端与授权服务器之间建立双向 TLS 连接时所使用的 TLS 配置。

该函数于 Qt 6.5 版本中引入。

另请参阅 setSslConfiguration() 和sslConfigurationChanged()。

[signal, since 6.5] void QAbstractOAuth2::sslConfigurationChanged(const QSslConfiguration &configuration)

当 TLS 配置发生变化时,会发出此信号。configuration 参数包含新的 TLS 配置。

该函数在 Qt 6.5 中引入。

另请参阅 sslConfiguration() 和setSslConfiguration()。

© 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.