2016-06-15 7 views
2

Я пытаюсь выполнить шаг 3 входа в твиттер. Обмен токена запроса OAuth для токена доступа OAuth. Я получил маркер доступа на шаге 1, и пользователь может разрешить на втором шаге, который возвращает oauth_verifier. Ошибка, которую я получаю на этом этапе, - 401 Несанкционированный доступ: Недействительный токен запроса.Twitter Недействительный токен запроса при обращении к токену доступа: C#

Некоторая информация о том, что я делаю неправильно, очень ценится.

public void Access_Token() 
    { 

     string oauthconsumerkey = ConfigurationManager.AppSettings["t_client_id"]; ; 
     string oauthconsumersecret = ConfigurationManager.AppSettings["t_client_secret"]; 
     string oauthverifier = Request.QueryString["oauth_verifier"]; 
     string oauthtokensecret = string.Empty; 
     string oauthtoken = Request.QueryString["oauth_token"]; 
     string oauthsignaturemethod = "HMAC-SHA1"; 
     string oauthversion = "1.0"; 
     string oauthnonce = HttpUtility.UrlEncode(Guid.NewGuid().ToString("N")); 
     TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
     string oauthtimestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString(); 
     string url = "https://api.twitter.com/oauth/access_token?oauth_verifier=" + Uri.EscapeDataString(oauthverifier); 
     SortedDictionary<string, string> basestringParameters = new SortedDictionary<string, string>(); 
     basestringParameters.Add("oauth_version", oauthversion); 
     basestringParameters.Add("oauth_consumer_key", oauthconsumerkey); 
     basestringParameters.Add("oauth_nonce", oauthnonce); 
     basestringParameters.Add("oauth_signature_method", oauthsignaturemethod); 
     basestringParameters.Add("oauth_timestamp", oauthtimestamp); 

     basestringParameters.Add("oauth_token", EncodeCharacters(oauthtoken)); 


     //Build the signature string 
     StringBuilder baseString = new StringBuilder(); 
     baseString.Append("POST" + "&"); 
     baseString.Append(EncodeCharacters(Uri.EscapeDataString(url.Split('?')[0]) + "&")); 
     foreach (KeyValuePair<string, string> entry in basestringParameters) 
     { 
      baseString.Append(EncodeCharacters(Uri.EscapeDataString(entry.Key + "=" + entry.Value + "&"))); 
     } 

     //Remove the trailing ambersand char last 3 chars - %26 
     string finalBaseString = baseString.ToString().Substring(0, baseString.Length - 3); 

     //Build the signing key 
     string signingKey = EncodeCharacters(Uri.EscapeDataString(oauthconsumersecret)) + "&" + 
EncodeCharacters(Uri.EscapeDataString(oauthtokensecret)); 
     //Sign the request 
     HMACSHA1 hasher = new HMACSHA1(new ASCIIEncoding().GetBytes(signingKey)); 
     string oauthsignature = Convert.ToBase64String(
      hasher.ComputeHash(new ASCIIEncoding().GetBytes(finalBaseString))); 

     //Tell Twitter we don't do the 100 continue thing 
     ServicePointManager.Expect100Continue = false; 
     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@url); 

     StringBuilder authorizationHeaderParams = new StringBuilder(); 
     authorizationHeaderParams.Append("OAuth "); 
     authorizationHeaderParams.Append("oauth_consumer_key=" + "\"" + Uri.EscapeDataString(oauthconsumerkey) + "\","); 
     authorizationHeaderParams.Append("oauth_nonce=" + "\"" + Uri.EscapeDataString(oauthnonce) + "\","); 
     authorizationHeaderParams.Append("oauth_signature=" + "\"" + Uri.EscapeDataString(oauthsignature) + "\","); 
     authorizationHeaderParams.Append("oauth_signature_method=" + "\"" + Uri.EscapeDataString(oauthsignaturemethod) + "\","); 
     authorizationHeaderParams.Append("oauth_timestamp=" + "\"" + Uri.EscapeDataString(oauthtimestamp) + "\","); 
     authorizationHeaderParams.Append("oauth_token=" + "\"" + Uri.EscapeDataString(oauthtoken) + "\""); 
     authorizationHeaderParams.Append("oauth_version=" + "\"" + Uri.EscapeDataString(oauthversion) + "\""); 
     webRequest.Headers.Add("Authorization", authorizationHeaderParams.ToString()); 


     webRequest.Method = "POST"; 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 



     //Allow us a reasonable timeout in case Twitter's busy 
     webRequest.Timeout = 3 * 60 * 1000; 
     string responseFromServer; 
     try 
     { 
      //webRequest.Proxy = new WebProxy("enter proxy details/address"); 
      HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse; 
      Stream dataStream = webResponse.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader(dataStream); 
      // Read the content. 
      responseFromServer = reader.ReadToEnd(); 
      // responseFromServer; ; 
     } 
     catch (WebException e) 
     { 
      HttpWebResponse errorR = e.Response as HttpWebResponse; 
      Stream dataStream = errorR.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader(dataStream); 
      // Read the content. 
      string dat = responseFromServer = reader.ReadToEnd(); 
     } 
+0

Я провел неловкое количество времени на это и предыдущий шаг в этом процессе. Я хотел поблагодарить вас за публикацию этого кода, потому что он помог мне преодолеть горб. Миллион спасибо. –

ответ

2

Вы забыли запятую (,) в следующей строке.

Ваша линия:

authorizationHeaderParams.Append("oauth_version=" + "\"" + Uri.EscapeDataString(oauthversion) + "\""); 

должно быть:

authorizationHeaderParams.Append("oauth_version=" + "\"" + Uri.EscapeDataString(oauthversion) + "\","); 
+0

Участвуя в этом сообщении, вы помогли мне преодолеть проблемную часть моего приложения. Спасибо. –