2012-09-28 41 views
0

我有問題從Twitter獲取請求令牌異步 - 服務器返回「遠程服務器返回錯誤:(401)未經授權。」Twitter獲取request_token與異步 - 401問題錯誤

下面是我使用的代碼 -

public void AcquireRequestToken(Action<bool> response) 
{ 

    string oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString())); 

    // build the signature 
    var headers = new Dictionary<string,string>() 
    { 
     { "oauth_consumer_key", _oAuthConfig.ConsumerKey }, 
     { "oauth_nonce", oauth_nonce }, 
     { "oauth_signature_method", "HMAC-SHA1" }, 
     { "oauth_timestamp", MakeTimestamp() }, 
     { "oauth_version", "1.0" }, 
     { "oauth_callback", PercentEncode(_oAuthConfig.Callback) }, 
    }; 

    string signature = MakeSignature ("POST", _oAuthConfig.RequestTokenUrl, headers); 
    string compositeSigningKey = MakeSigningKey(_oAuthConfig.ConsumerSecret, null); 
    string oauth_signature = MakeOAuthSignature(compositeSigningKey, signature); 

    Uri fullUri = new Uri(_oAuthConfig.RequestTokenUrl); 

    var request = (HttpWebRequest)WebRequest.Create(fullUri); 
    request.Method = "POST"; 

    request.Headers.Add("oauth_consumer_key", PercentEncode(_oAuthConfig.ConsumerKey)); 
    request.Headers.Add("oauth_nonce", PercentEncode(oauth_nonce)); 
    request.Headers.Add("oauth_signature_method", PercentEncode("HMAC-SHA1")); 
    request.Headers.Add("oauth_timestamp", PercentEncode(MakeTimestamp())); 
    request.Headers.Add("oauth_version", "1.0"); 
    request.Headers.Add("oauth_callback", PercentEncode(_oAuthConfig.Callback)); 
    request.Headers.Add("oauth_signature", PercentEncode(oauth_signature)); 

    try 
    { 

     request.BeginGetResponse(new AsyncCallback(result => 
     { 
      string contents = String.Empty; 
      HttpWebRequest theRequest = (HttpWebRequest)result.AsyncState; 

      if (theRequest != null) 
      { 
       try 
       { 
        HttpWebResponse theResponse = (HttpWebResponse)theRequest.EndGetResponse(result); 

        using (Stream stream = theResponse.GetResponseStream()) 
        using (StreamReader reader = new StreamReader(stream)) 
        { 
         contents = reader.ReadToEnd(); 
        } 

        Dictionary<string, object> results = JsonConvert.DeserializeObject<Dictionary<string, object>>(contents); 

        _requestToken = (string)results ["oauth_token"]; 
        _requestTokenSecret = (string)results ["oauth_token_secret"]; 

        response(true); 
       } 
       catch (WebException e) 
       { 
        response(false); 
       } 
      } 
      else 
      { 
       response(false); 
      } 
     }), request); 

    } 
    catch (WebException e) 
    { 
     response(false); 
    } 

} 

我的舊(非異步)代碼工作正常 -

public bool AcquireRequestToken() 
{ 
    var headers = new Dictionary<string,string>() 
    { 
     { "oauth_callback", PercentEncode(_oAuthConfig.Callback) }, 
     { "oauth_consumer_key", _oAuthConfig.ConsumerKey }, 
     { "oauth_signature_method", "HMAC-SHA1" }, 
     { "oauth_timestamp", MakeTimestamp() }, 
     { "oauth_version", "1.0" } 
    }; 

    string signature = MakeSignature ("POST", _oAuthConfig.RequestTokenUrl, headers); 
    string compositeSigningKey = MakeSigningKey(_oAuthConfig.ConsumerSecret, null); 
    string oauth_signature = MakeOAuthSignature(compositeSigningKey, signature); 

    var wc = new WebClient(); 
    headers.Add ("oauth_signature", PercentEncode(oauth_signature)); 
    wc.Headers [HttpRequestHeader.Authorization] = HeadersToOAuth(headers); 

    try 
    { 
     var result = HttpUtility.ParseQueryString(wc.UploadString (new Uri(_oAuthConfig.RequestTokenUrl), "")); 

     if (result ["oauth_callback_confirmed"] != null) 
     { 
      _requestToken = result ["oauth_token"]; 
      _requestTokenSecret = result ["oauth_token_secret"]; 

      return true; 
     } 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 

} 

標頭是在新版本略有不同,但讓他們同樣沒有幫助。

感謝您的任何建議!

回答

0

你錯了頭。只有一個叫Authorization HTTP標頭:

Authorization: OAuth oauth_consumer_key="<the consumer key of your app>", oauth_nonce="<the nonce>", oauth_signature="<the signature>", oauth_signature_method="HMAC-SHA1", oauth_timestamp="<the timestamp>", oauth_token="<your token>", oauth_version="1.0" 

該頁面將告訴您如何使它:https://dev.twitter.com/docs/auth/authorizing-request。它是除了兩個方法,所有的方法都是一致的:

  • request_token需要oauth_callback但不oauth_token(正常的,因爲你沒有的話)。
  • access_token需要oauth_verifier(您將在第二步後得到它)。