如何使用QOauth1进行三足式OAuth1授权请求

时间:2019-03-22 17:04:02

标签: c++ qt qt5 qnetworkaccessmanager qnetworkrequest

我想使用QtNetworkAuthorization通过REST API授予对某些资源的访问权限。我要连接的服务器使用Oauth1。 有一些Qt网络授权的示例,但使用的是QOauth的旧接口。官方SDK中的示例显示了example of Twitter 但是它要求GUI应用程序使用QDesktopServices,而Twitter不使用verifier。当用户允许访问时,它将自动授予访问权限。

我想做的事情需要3个步骤。

1)使用带有clientID和clientSecret的request_token查询获得临时凭证。

2)使用clientID,clientSecret和tempToken,tempSecret要求用户打开constentData url,其中显示验证者代码的用户。用户将其复制。

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,但它们是受保护的。在QOauth1中也没有设置setVerifier的功能。

如何访问使用QOAuth1来通过身份验证的所有三个步骤?

0 个答案:

没有答案