【问题标题】:Twitterizer- The remote server returned an error: (401) UnauthorizedTwitterizer-远程服务器返回错误:(401)未经授权
【发布时间】:2012-02-23 12:23:15
【问题描述】:

我正在关注 Ricky 的 Twitterizer example(我自己做了一些修改),但是当我尝试发送身份验证请求时收到“401 Unauthorized”异常:

{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=}

关于可能导致此问题的任何想法?

【问题讨论】:

    标签: c# asp.net-mvc-3 twitter twitter-oauth twitterizer


    【解决方案1】:

    登录 dev.twitter.com 并仔细检查您的应用程序是否为 Web 应用程序。为了成为 Web 应用程序,您必须在此处提供回调 url,即使您要在运行时提供“真实”回调。

    仅供参考,您不能为注册的回调 url 提供“localhost”,但可以使用 127.0.0.1。

    【讨论】:

    • 啊,明白了!谢谢 Ricky,我没有将我的应用程序设置为 Web 应用程序......我会进行更改,看看是否可以让它正确运行。附:这是否意味着我的桌面服务将不再能够使用相同的誓言令牌?
    • 您的桌面应用程序可以使用您网站的消费者令牌:在运行时将“oob”作为您的回调 url,而 twitter 将使用基于 pin 的身份验证。
    • 是的,是的!就是这样。我没有在 Twitter 网站上指定我的回调 URL。 +1
    • 我也遇到同样的错误:远程服务器返回错误:(401)未经授权。任何想法?部署在生产环境中,但仍然抛出错误。帮忙?
    猜你喜欢
    • 2012-03-14
    • 2012-04-29
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2012-09-19
    相关资源
    最近更新 更多