Как сделать 3-х сторонний запрос на авторизацию OAuth1 с помощью QOauth1 - PullRequest
0 голосов
/ 22 марта 2019

Я хочу использовать QtNetworkAuthorization для предоставления доступа к некоторым ресурсам через API REST. Сервер, к которому я хочу подключиться, использует Oauth1.Есть примеры Qt Network Authorization, но с использованием старых интерфейсов QOauth.Пример в официальном SDK показывает пример Twitter , но для использования QDesktopServices требуется приложение с графическим интерфейсом, а Twitter не использует verifier.Он автоматически предоставляет доступ, когда пользователь разрешает доступ.

Для того, что я хочу сделать, требуется 3 шага.

1) Используя запрос request_token с clientID и clientSecret, получить временные учетные данные.

2) Используя clientID, clientSecret и tempToken, tempSecret просит пользователя открыть URL constentData, в котором пользователю показан код верификатора.Пользователь копирует его.

3) Используя верификатор, clientID и временные учетные данные, наше приложение запрашивает постоянные учетные данные. До сих пор используя QOAuth1, мой код:

const QString request_token_url = "https://sandboxapi.deere.com/platform/oauth/request_token";
QString request_token_query_args = "oauth_callback=oob";
QString authorize_url_base ="https://my.deere.com/consentToUseOfData";
const QString access_token_url = "https://sandboxapi.deere.com/platform/oauth/access_token";
QNetworkAccessManager * manager = new QNetworkAccessManager();

QString base_request_token_url = request_token_url + (request_token_query_args.isEmpty() ? "" : ("?"+request_token_query_args) );
QOAuth1 * oth = new QOAuth1(&a);
oth->setSignatureMethod(QOAuth1::SignatureMethod::Hmac_Sha1);
oth->setClientIdentifier(client_key);
oth->setClientSharedSecret(client_secret);
oth->setTemporaryCredentialsUrl(request_token_url);
oth->setAuthorizationUrl(authorize_url_base);
oth->setTokenCredentialsUrl(QUrl(access_token_url));

oth->setReplyHandler(new QOAuthOobReplyHandler());
oth->setContentType(QOAuth1::ContentType::Json);

oth->setNetworkAccessManager(manager);

oth->grant();
QObject::connect(oth,&QOAuth1::granted,[](){

    cout<<"granted "<<endl;
});

QObject::connect(oth->replyHandler(),&QAbstractOAuthReplyHandler::tokensReceived,[](){
    qDebug()<<"token received";
});

QObject::connect(manager,&QNetworkAccessManager::finished,[oth,authorize_url_base](QNetworkReply * reply){

    auto result=reply->readAll();
    auto tokenSecretPair=result.split('&');

    auto token = tokenSecretPair[0].split('=');
    auto secret = tokenSecretPair[1].split('=');
    qDebug()<<token<<" "<<secret;
    oth->setTokenCredentials(token[1],secret[1]);
    qDebug()<<oth->tokenCredentials();
});

С этим фрагментом кодаЯ могу только получить временные полномочия.Я не могу перейти ко второму шагу, чтобы запросить верификатор пользователя.В реализации есть методы типа requestTemporaryTokens, но они защищены.Также нет функции setVerifier в QOauth1.

Как я могу получить доступ к использованию QOAuth1, чтобы пройти все три шага аутентификации?

...