2012-11-07 1 views
5

私はUbuntu One APIにアクセスするためにDelphi XE2とIndy 10を使用しています。ここまでは順調ですね。 OAuthトークンをクラウドからdescribedとして取得できました。今私は(describedのような)APIを使用して開始したい:Ubuntu One APIにアクセスすると「401 UNAUTHORIZED」または「400 BAD REQUEST」と表示されます

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 BAD REQUEST」になります。 OAuthライブラリはSourceForgeであり、Dropboxで動作します(Dropboxはクエリ文字列内にある場合はOAuth-Paramsを受け入れます)。トークンは正確で有効です。私は間違って何をしていますか?

ところで:この時点で

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

、新しく作成されたトークンは、UbuntuのSSOサービスに、 他の方法への認証に使用することができますが、まだ Ubuntuの一つで使用することはできませんAPI。新たに 作成したトークンをSSOサービスからコピーするようにUbuntu Oneに伝える必要があります。これは、新しいOAuthトークンで署名された次のURLにGET リクエストを発行することによって行われます。 からUbuntu One: Authorization page

私には恥ですが、私はそれをするのを忘れました。

関連する問題