QOAuth2DeviceAuthorizationFlow Class
QOAuth2DeviceAuthorizationFlow 클래스는 디바이스 인증 그랜트 (Device Authorization Grant) 흐름의 구현을 제공합니다. 더 보기...
| 헤더: | #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 토큰을 획득하고 갱신하는 데 사용되는 ‘기기 인증 그랜트 ( Device Authorization Grant )’ 흐름을 구현합니다. 이러한 기기에는 텔레비전, 기계용 HMI, 가전제품 및 IoT 기기가 포함됩니다.
디바이스 플로우는 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,
[](const QUrl&verificationUrl, const QString&userCode, const QUrl&completeVerificationUrl) {
if (completeVerificationUrl.isValid()) {
// 인증 서버가 URL 매개변수의 일부로 필요한 데이터가 이미 포함된
// 완성된 URL 을 제공한 경우 ,
// 해당 URL을 사용할 수 있습니다
qDebug() << "Complete verification uri:" << completeVerificationUrl;
} else {
// 인증 서버에서 확인용 URL만 제공된 경우, 해당 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 |
알림 신호:
| 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.