2012-11-07 24 views
5

में मैं उबंटू वन एपीआई तक पहुंचने के लिए इंडी 10 के साथ डेल्फी एक्सई 2 का उपयोग कर रहा हूं। अब तक सब ठीक है। मैं क्लाउड से OAuth टोकन को described के रूप में प्राप्त करने में सक्षम था। अब मैं (described की तरह) API का उपयोग शुरू करना चाहते हैं:उबंटू वन एपीआई के परिणाम "401 अनधिकृत" या "400 बाड अनुरोध"

function TUbuntuOneApi.DoRequest(const URL: String): String; 
var 
    RequestParams: TStringList; 
    HeaderIndex: Integer; 
const 
    OAuthAuthorisationHeader = 'OAuth realm="", oauth_version="%s", oauth_nonce="%s", oauth_timestamp="%s", oauth_consumer_key="%s", oauth_token="%s", oauth_signature_method="%s", oauth_signature="%s"'; 

begin 
    RequestParams := SignOAuthRequestParams(URL, fOAuthAppToken, fOAuthAccessToken); 

{ OAuth realm="", oauth_version="1.0", 
    oauth_nonce="$nonce", oauth_timestamp="$timestamp", 
    oauth_consumer_key="$consumer_key", oauth_token="$token", 
    oauth_signature_method="PLAINTEXT", 
    oauth_signature="$consumer_secret%26$token_secret" 
    } 

    HeaderIndex := IdHTTP.Request.CustomHeaders.IndexOfName('Authorization'); 
    if HeaderIndex >= 0 then 
    begin 
    IdHTTP.Request.CustomHeaders.Delete(HeaderIndex); 
    end; 

    // Solving: http://stackoverflow.com/questions/7323036/twitter-could-not-authenticate-with-oauth-401-error 
    IdHTTP.Request.CustomHeaders.FoldLines := false; 

    IdHTTP.Request.CustomHeaders.AddValue('Authorization', Format(OAuthAuthorisationHeader, [ 
     TIdURI.URLDecode(RequestParams.Values['oauth_version']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_nonce']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_timestamp']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_consumer_key']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_token']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_signature_method']), 
     TIdURI.URLDecode(RequestParams.Values['oauth_signature']) 
    ])); 

    // Execute 
    Result := IdHTTP.Get(URL); 
    RequestParams.Free; 
end; 

function TUbuntuOneApi.Test: String; 
begin 
    //Result := DoRequest('https://one.ubuntu.com/api/file_storage/v1'); 
    Result := DoRequest('https://one.ubuntu.com/api/account/'); 
end; 

"401 अनधिकृत" में कॉलिंग https://one.ubuntu.com/api/file_storage/v1 का परिणाम है। कॉलिंग https://one.ubuntu.com/api/account/ परिणाम "400 बाड अनुरोध" में परिणाम। ओथ लाइब्रेरी SourceForge से है और ड्रॉपबॉक्स के साथ काम करता है (ड्रॉपबॉक्स ओएथ-पैराम्स स्वीकार करता है अगर वे क्वेरी-स्ट्रिंग में हैं)। टोकन सही और मान्य हैं। मैं क्या गलत कर रहा हूं?

BTW

:

function SignOAuthRequestParams(const URL: String; OAuthAppToken, OAuthAccessToken: TOAuthToken): TStringList; 
var 
    Consumer: TOAuthConsumer; 
    ARequest: TOAuthRequest; 
    Response: String; 
    HMAC: TOAuthSignatureMethod; 
begin 
    HMAC := TOAuthSignatureMethod_PLAINTEXT.Create; 
    // Consumer erzeugen 
    Consumer := TOAuthConsumer.Create(OAuthAppToken.Key, OAuthAppToken.Secret); 

    // Request erzeugen 
    ARequest := TOAuthRequest.Create(URL); 
    ARequest := ARequest.FromConsumerAndToken(Consumer, OAuthAccessToken, URL); 
    ARequest.Sign_Request(HMAC, Consumer, OAuthAccessToken); 

    Result := TStringList.Create; 
    Result.AddStrings(ARequest.Parameters); 

    ARequest.Free; 
    Consumer.Free; 
    HMAC.Free; 
end; 

उत्तर

1

इस बिंदु पर, नव निर्मित टोकन, अन्य तरीकों को प्रमाणित करने में उबंटू SSO सेवा पर इस्तेमाल किया जा सकता है, लेकिन अभी तक उबंटू एक साथ नहीं किया जा सकता एपीआई। एसएसओ सेवा से बनाए गए टोकन को नए की प्रतिलिपि बनाने के लिए हमें उबंटू वन को बताना होगा। यह GET जारी करने वाले यूआरएल टोकन के साथ हस्ताक्षर किए गए निम्नलिखित यूआरएल को जारी करके किया जाता है। Ubuntu One: Authorization page से।

मुझ पर शर्म आती है, मैं ऐसा करना भूल गया।