Twitterizer - удаленный сервер возвратил ошибку: (401) не авторизован - PullRequest
3 голосов
/ 31 января 2012

Я следую примеру Рикки 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=}

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

1 Ответ

8 голосов
/ 02 февраля 2012

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

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

...