2012-01-31 3 views
3

Я следую за Ricky Twitterizer example (с некоторыми изменениями на моем конце), но я получаю исключение «401 Unauthorized», когда пытаюсь отправить запрос на аутентификацию :Twitterizer- Удаленный сервер возвратил ошибку: (401) Неавторизованный

{Twitterizer.TwitterizerException: The remote server returned an error: (401) Unauthorized. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 
    at Twitterizer.WebRequestBuilder.ExecuteRequest() 
    at Twitterizer.OAuthUtility.GetRequestToken(String consumerKey, String consumerSecret, String callbackAddress) 
    --- End of inner exception stack trace --- 
    at Twitterizer.OAuthUtility.GetRequestToken(String consumerKey, String consumerSecret, String callbackAddress) 
    at MyProject.Controllers.AccountController.Authenticate(String oauthToken, String oauthVerifier, String returnUrl) in C:\path\to\my\website\Controllers\AccountController.cs:line 78} 

у меня есть личные переменные-члены, которые держат свой пользовательский и секрет:

// I obtain my consumer key and the consumer secret from the web config 
private static readonly string _twitterConsumerKey = WebConfigurationManager.AppSettings["TwitterConsumerKey"]; 
private static readonly string _twitterConsumerSecret = WebConfigurationManager.AppSettings["TwitterConsumerSecret"]; 

и я также есть контроллер, который обрабатывает вход:

// GET: Account/Logon/ 
[HttpPost] 
public ActionResult LogOn(string returnUrl) 
{ 
    return Authenticate(string.Empty, string.Empty, HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])); 
} 

//private ActionResult 
private ActionResult Authenticate(string oauthToken, string oauthVerifier, string returnUrl) 
{ 
    if (string.IsNullOrEmpty(oauthToken) || string.IsNullOrEmpty(oauthVerifier)) 
    { 
     UriBuilder builder = new UriBuilder(this.Request.Url); 
     builder.Query = string.Concat(
      builder.Query, 
      string.IsNullOrEmpty(builder.Query) ? string.Empty : "&", 
      "returnUrl=", 
      returnUrl); 

     try 
     { 
      string token = OAuthUtility.GetRequestToken(
       _twitterConsumerKey, 
       _twitterConsumerSecret, 
       builder.ToString()).Token; // <-- Throws the exception 

      return Redirect(OAuthUtility.BuildAuthorizationUri(token, true).ToString()); 
     } 
     catch (Exception e) 
     { 
      ViewBag.Error = e.ToString(); // 401 Unauthorized 
      return View(); 
     } 
    } 

    OAuthTokenResponse tokens = OAuthUtility.GetAccessToken(
     _twitterConsumerSecret, 
     _twitterConsumerSecret, 
     oauthToken, 
     oauthVerifier); 

    // Save the user details and set the authentication (cookie) 
    // ... 
    // ... 
    // ... 

    if (string.IsNullOrEmpty(returnUrl)) 
     return Redirect("/"); 
    else 
     return Redirect(returnUrl); 
} 

Обратите внимание, что я удалил часть кода, которая не относится к ошибке. Вышеупомянутый код приводит к исключению. Следует отметить, что мой returnUrl пуст (хотя то же самое происходит, если я также предоставляю returnUrl); все остальное кажется прекрасным. HttpWebRequest выглядит следующим образом:

Address = {https://api.twitter.com/oauth/request_token?oauth_callback=http://localhost:24465/Account/LogOn?returnUrl=} 

Любые идеи о том, что может быть причиной этой проблемы?

ответ

8

Войдите в dev.twitter.com и дважды проверьте, что ваше приложение является веб-приложением. Чтобы быть веб-приложением, вы ДОЛЖНЫ поставлять URL-адрес обратного вызова, даже если вы собираетесь обеспечить «реальный» обратный вызов во время выполнения.

FYI, вы не можете указать «localhost» для зарегистрированного URL-адреса обратного вызова, но вы можете использовать 127.0.0.1.

+0

Ah, gotcha! Спасибо, Рикки, у меня не было приложения, настроенного как веб-приложение ... Я сделаю изменения и посмотрю, смогу ли я запустить его правильно. Постскриптум Означает ли это, что мой настольный сервис больше не сможет использовать те же самые клятвы? – Kiril

+0

Да, это была проблема ... спасибо! – Kiril

+1

Ваше настольное приложение может использовать токен вашего сайта: дать «oob» в качестве URL-адреса обратного вызова во время выполнения, а твиттер будет использовать аутентификацию на основе PIN-кода. –

Смежные вопросы