Я следую за 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=}
Любые идеи о том, что может быть причиной этой проблемы?
Ah, gotcha! Спасибо, Рикки, у меня не было приложения, настроенного как веб-приложение ... Я сделаю изменения и посмотрю, смогу ли я запустить его правильно. Постскриптум Означает ли это, что мой настольный сервис больше не сможет использовать те же самые клятвы? – Kiril
Да, это была проблема ... спасибо! – Kiril
Ваше настольное приложение может использовать токен вашего сайта: дать «oob» в качестве URL-адреса обратного вызова во время выполнения, а твиттер будет использовать аутентификацию на основе PIN-кода. –