3

私は Ricky のTwitterizer の例に従っています(一部変更を加えています) が、認証要求を送信しようとすると「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);
}

エラーに関係のないコードの一部を削除したことに注意してください。上記のコードだけでは、例外が発生します。注意すべきことの 1 つは、 myreturnUrlが空であることです (ただし、 a も指定した場合も同じことが起こりreturnUrlます)。他のすべては問題ないようです。は次のHttpWebRequestようになります。

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

この問題の原因について何か考えはありますか?

4

1 に答える 1

8

dev.twitter.comにログインし、アプリケーションがWebアプリケーションであることを再確認します。Webアプリケーションになるには、実行時に「実際の」コールバックを提供する場合でも、そこにコールバックURLを指定する必要があります。

参考までに、登録されたコールバックURLに「localhost」を指定することはできませんが、127.0.0.1を使用できます。

于 2012-02-01T22:32:12.320 に答える