【发布时间】:2011-10-25 20:20:43
【问题描述】:
resp = (HttpWebResponse)request.GetResponse();是的,我知道这可能是一些愚蠢的错误,或者只是我不精通 Oauth 的东西,但我已经停了下来,不知道从哪里开始,经过多次搜索和尝试,我虚心寻求帮助。
我正在尝试从 Twitter 获取请求令牌以尝试获取用户的 Twitter 提要,但由于其他业务原因,我无法使用库...
这是目前为止的代码:
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("oauth_callback", "www.url.com/redirect.aspx");
parameters.Add("oauth_consumer_key", <Consumer_KEY>);
parameters.Add("oauth_nonce", generateNonce());
parameters.Add("oauth_signature_method", "HMAC-SHA1");
parameters.Add("oauth_timestamp", CurrentUNIXTimestamp.Get());
parameters.Add("oauth_version", "1.0");
parameters = parameters.OrderBy(x => x.Key).ToDictionary(v => v.Key, v => v.Value);
string concat = "";
string OAuthHeader = "OAuth ";
foreach (string k in parameters.Keys)
{
if (k == "oauth_callback")
{
concat += k + "%3D" + EncodeToUpper(parameters[k]) + "%26";
OAuthHeader += k + "=" + "\"" + EncodeToUpper(parameters[k]) + "\", ";
}
else
{
concat += k + "%3D" + parameters[k] + "%26";
OAuthHeader += k + "=" + "\"" + parameters[k] + "\", ";
}
}
concat = concat.Remove(concat.Length - 3, 3);
concat = "POST&" + EncodeToUpper("https://api.twitter.com/oauth/request_token" ) + "&" + concat;
//byte[] content = Encoding.UTF8.GetBytes(concat);
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", EncodeToUpper(<CONSUMER SECRET>, ""));
byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(concat);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
string hash = Convert.ToBase64String(hashBytes);
OAuthHeader += "oauth_signature=\"" + EncodeToUpper(hash) + "\"";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.twitter.com/oauth/request_token");
request.Method = "POST";
request.Headers["Authorization"] = OAuthHeader;
StringBuilder responding = new StringBuilder();
HttpWebResponse resp = null;
try
{
resp = (HttpWebResponse)request.GetResponse();
}
catch (WebException exc)
{
lblError.Text = "Error Connecting to Social Network " + exc.Message;
}
if (resp != null)
{
using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
{
responding.Append(reader.ReadToEnd());
}
}
Nonce 的一个示例是“ne8ehvVr0pW2EUxNHdxdyqbi8Fwphatt3SW1yerTyXH”,CurrentUNIXTimestamp 由
生成 public static class CurrentUNIXTimestamp
{
public static string Get()
{
return Convert.ToString((int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds);
}
}
我已经尝试了尽可能多的事情,不再存在客户端/浏览器问题(这是许多其他答案),服务器时间与英国夏令时正确(我不知道这是否会是一个问题,但我尝试在 unix 时间戳上添加一个小时仍然是 401。),我已经在 twitter 应用程序页面上定义了回调 url
我在 facebook 上使用了相同的应用程序(我知道它的 oauth 不同,但可能会有所帮助)
实际错误出现在 resp = (HttpWebResponse)request.GetResponse(); 处,出现 401 错误。我无法从 exc.response 对象中获得更多详细信息,有人能说如何从 VS2008 中的错误中获取有用的信息吗?
感谢您的任何回答
【问题讨论】:
标签: c# twitter oauth twitter-oauth