我想使用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来通过身份验证的所有三个步骤?