2013-03-20 2 views
1

oAuth를 통해 Twitter에 연결하려고합니다. https://api.twitter.com/oauth/request_token에 POST 요청을하고 있습니다.https://api.twitter.com/oauth/request_token Blackberry 네이티브 SDK에서 실패

다음은 내 자료 서명 문자열

POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fapi.ec2.phunware.com%252Fapi%252Ftwitter%26oauth_consumer_key%3D6jq5dNZcccoPbApAJ0sOaA%26oauth_nonce%3DN2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY%3D%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1362843354%26oauth_version%3D1.0 

내 기본 서명을 확인하는 도구 http://quonos.nl/oauthTester/ 사용의 예입니다. 여기

OAuth oauth_callback="http%3A%2F%2Fapi.ec2.phunware.com%2Fapi%2Ftwitter",oauth_consumer_key="6jq5dNZcccoPbApAJ0sOaA",oauth_nonce="N2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY=",oauth_signature_method="HMAC-SHA1",oauth_signature="7ney2RxElbHUl2t1Jnz57pQpmFs%3D",oauth_timestamp="1362843354",oauth_version="1.0" 

내가 내 MAC 터미널

curl --request 'POST' 'https://api.twitter.com/oauth/request_token' --header 'Authorization: OAuth oauth_callback="http%3A%2F%2Fapi.ec2.phunware.com%2Fapi%2Ftwitter",oauth_consumer_key="6jq5dNZcccoPbApAJ0sOaA",oauth_nonce="N2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY=",oauth_signature_method="HMAC-SHA1",oauth_signature="7ney2RxElbHUl2t1Jnz57pQpmFs%3D",oauth_timestamp="1362843354",oauth_version="1.0"' --verbose 

에서 다음 명령을 시도 해당 헤더 내가 401 권한이없는 오류가 발생합니다. oauth_callback = "oob"을 설정하려고했지만 여전히 같은 오류가 발생합니다.

도와주세요. Blackberry Native SDK를 사용하여 코드를 작성하고 있습니다. 여기에 코드를 붙여 넣습니다. Blackberry 10.1 Simulator를 통해 시도 할 때 204 오류가 발생합니다.

QByteArray Twitter::generateTimeStamp() 
{ 
    QDateTime current = QDateTime::currentDateTime(); 
    uint seconds = current.toTime_t(); 
    return QString::number(seconds,10).toUtf8(); 
} 

QByteArray Twitter::generateNonce() 
{ 
    QString nonce = QUuid::createUuid().toString(); 
    nonce.remove(QRegExp("[^a-zA-Z\\d\\s]")); 
    qDebug()<< nonce.toUtf8(); 
    return nonce.toUtf8().toBase64(); 
} 

QByteArray Twitter::generateSignatureBase(const QUrl& url, HttpMethod method, const QByteArray& timestamp, const QByteArray& nonce,bool addCallbackURL) 
{ 
    QList<QPair<QByteArray, QByteArray> > urlParameters = url.encodedQueryItems(); 
    QList<QByteArray> normParameters; 

    QListIterator<QPair<QByteArray, QByteArray> > i(urlParameters); 
    while(i.hasNext()){ 
      QPair<QByteArray, QByteArray> queryItem = i.next(); 
      QByteArray normItem = queryItem.first + '=' + queryItem.second; 
      normParameters.append(normItem); 
    } 

    //consumer key 
    normParameters.append(QByteArray("oauth_consumer_key=") + consumer->consumerKey()); 

    //token 
    if(accessToken != NULL){ 
      normParameters.append(QByteArray("oauth_token=") + accessToken->oauthToken()); 
    } 

    //signature method, only HMAC_SHA1 
    normParameters.append(QByteArray("oauth_signature_method=HMAC-SHA1")); 
    //time stamp 
    normParameters.append(QByteArray("oauth_timestamp=") + timestamp); 
    //nonce 
    normParameters.append(QByteArray("oauth_nonce=") + nonce); 
    //version 
    normParameters.append(QByteArray("oauth_version=1.0")); 

    //callback url 
    if(addCallbackURL) 
     normParameters.append(QByteArray("oauth_callback=") + QByteArray(CALLBACK_URL).toPercentEncoding()); 

    //OAuth spec. 9.1.1.1 
    qSort(normParameters); 
    qDebug()<<normParameters; 
    QByteArray normString; 
    QListIterator<QByteArray> j(normParameters); 
    while (j.hasNext()) { 
     normString += j.next().toPercentEncoding(); 
     normString += "%26"; 
    } 
    normString.chop(3); 
    qDebug()<<normString; 
    //OAuth spec. 9.1.2 
    QString urlScheme = url.scheme(); 
    QString urlPath = url.path(); 
    QString urlHost = url.host(); 
    QByteArray normUrl = urlScheme.toUtf8() + "://" + urlHost.toUtf8() + urlPath.toUtf8(); 

    QByteArray httpm; 

    switch (method) 
    { 
     case GET: 
       httpm = "GET"; 
       break; 
     case POST: 
       httpm = "POST"; 
       break; 
     case DELETE: 
       httpm = "DELETE"; 
       break; 
     case PUT: 
       httpm = "PUT"; 
       break; 
    } 
    qDebug()<<"signature base="<<httpm + '&' + normUrl.toPercentEncoding() + '&' + normString; 
    //OAuth spec. 9.1.3 
    return httpm + '&' + normUrl.toPercentEncoding() + '&' + normString; 
} 

QByteArray Twitter::generateAuthorizationHeader(const QUrl& url, HttpMethod method,bool addCallbackURL) 
{ 
    QByteArray timeStamp = generateTimeStamp(); 
    QByteArray nonce = generateNonce(); 

    QByteArray baseString = generateSignatureBase(url, method, timeStamp, nonce,addCallbackURL); 
    QByteArray key = consumer->consumerSecret() + '&'; 
    if(accessToken != NULL) 
     key = key + accessToken->oauthTokenSecret(); 
    QByteArray signature = HMACSH1::hmacSha1(key,baseString).toPercentEncoding(); 
    QByteArray header; 
    header += "OAuth "; 
    if(addCallbackURL) 
     header += "oauth_callback=\"" + QByteArray(CALLBACK_URL).toPercentEncoding() + "\","; 
    header += "oauth_consumer_key=\"" + consumer->consumerKey() + "\","; 
    header += "oauth_nonce=\"" + nonce + "\","; 
    header += "oauth_signature_method=\"HMAC-SHA1\","; 
    header += "oauth_signature=\"" + signature + "\","; 
    header += "oauth_timestamp=\"" + timeStamp + "\","; 
    if(accessToken != NULL) 
      header += "oauth_token=\"" + accessToken->oauthToken() + "\","; 
    header += "oauth_version=\"1.0\""; 
    qDebug()<<"header =" <<header; 
    return header; 
} 

void Twitter::requestForToken() 
{ 
    QUrl url(TWITTER_REQUEST_TOKEN_URL); 
    QByteArray oauthHeader = generateAuthorizationHeader(url, POST,true); 

    QNetworkRequest req(url); 
    req.setRawHeader("Authorization", oauthHeader); 
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 
    req.setHeader(QNetworkRequest::ContentLengthHeader,"0"); 

    QNetworkReply *reply = networkAccessManager->post(req, QByteArray()); 
    connect(networkAccessManager, SIGNAL(finished (QNetworkReply*)), this, SLOT(tokenFetchSuccessfull(QNetworkReply*))); 
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(tokenFetchFailed(QNetworkReply::NetworkError))); 
    qDebug()<<"Request For Token"; 
} 

답변

1

네이티브 SDK를 사용 중이라고 언급했는데 캐스케이드도 사용하고 있습니까? 그렇다면 GitHub의 bb-cascades-oauth 라이브러리를 사용하면 더 나은 행운을 누릴 수 있습니다. OAuth1 및 OAuth2를 지원합니다.

here 팁을 기반으로 잘못된 타임 스탬프가있는 것이 일반적인 문제 일 수 있으므로 시뮬레이터의 날짜와 시간이 올바른지 확인하십시오.

다른 개발자 herehttp://quonos.nl/oauthTester/이 잘못된 실제 이중 인증 요청을 할 때 401 오류를 발생시키는 잘못된 이스케이프 처리 된 헤더를 요구한다는 사실을 발견했습니다. 동일한 테스터를 사용하고 위의 기본 서명 문자열에 이중 이스케이프 문자가 표시되어 있으므로 이중 이스케이프 처리없이 시도하고 싶을 수도 있습니다.

관련 문제