Twitterizer-远程服务器返回错误:(401)未授权
问题描述:
我正在关注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=}
有什么想法可能会导致此问题?
答
登录到dev.twitter.com并仔细检查您的应用程序是否是Web应用程序。为了成为一个Web应用程序,你必须在那里提供一个回调url,即使你要在运行时提供一个“真正的”回调。
仅供参考,您无法为注册的回调URL提供'localhost',但您可以使用127.0.0.1。
啊,呃!感谢Ricky,我没有将我的应用程序设置为一个Web应用程序......我将进行更改,看看能否让它正常运行。附:这是否意味着我的桌面服务将不再能够使用相同的宣誓令牌? – Kiril 2012-02-01 22:58:10
Yah,那是问题......谢谢! – Kiril 2012-02-01 23:15:34
您的桌面应用程序可以使用您的网站的消费者令牌:在运行时将“oob”作为您的回调网址,并且Twitter将使用基于引脚的身份验证。 – 2012-02-02 21:59:44