我尝试从Twitter OAuth获取请求令牌,当我尝试获取响应时,我总是收到服务器错误401。我不想使用现有的库,因为我尝试学习Oauth并且可能构建我自己的库。这是我的简单代码:
WebRequest request = WebRequest.Create("https://api.twitter.com/oauth/request_token");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
StringBuilder sbParams = new StringBuilder();
sbParams.Append("OAuth ");
sbParams.AppendFormat("oauth_consumer_key={0},", "[COMSUMERKEY]");
sbParams.AppendFormat("oauth_signature_method={0},", "PLAINTEXT");
sbParams.AppendFormat("oauth_signature={0},", HttpUtility.UrlEncode("[COMSUMER_SECRET]&"));
sbParams.AppendFormat("oauth_timestamp={0},", ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());
sbParams.AppendFormat("oauth_nonce={0},", "asdfalkjpoijwpeonpoaisudfnpowieuyfpasosdfdn");
sbParams.AppendFormat("oauth_version={0},", "1.0");
sbParams.AppendFormat("oauth_callback={0}", HttpUtility.UrlEncode(Request.Url.ToString()));
request.Headers.Add("Authorization", sbParams.ToString());
// Get the response.
WebResponse response = request.GetResponse();
答案 0 :(得分:1)
来自http://oauth.net/core/1.0a/#http_codes你知道这些
HTTP 401 Unauthorized Invalid Consumer Key Invalid / expired Token Invalid signature Invalid / **used nonce
“使用过的nonce”可能是个问题。您需要生成随机字符串。来自http://oauth.net/core/1.0a/#nonce
随机数字是一个随机字符串,为每个请求
唯一生成
在严肃的事业上。一旦你收到消费者的秘密,你就不应该传递它!许多OAuth库都有
request_request_token(consumer_key,consumer_secret)
尽管出现了消费者,但消费者秘密从未传播。它在客户端使用,用于验证服务器的响应。 (类似的验证也发生在服务器端)
并且您没有为签名请求添加任何静态值。来自http://oauth.net/core/1.0a/#signing_process
All Token requests and Protected Resources requests MUST be signed by the Consumer and verified by the Service Provider.
底线:请阅读http://oauth.net/core/1.0a/文章,了解协议的工作原理。并选择一个不会抽象太多细节的动手OAuth库(我使用的oauth-php库随附了SQL表和托管数据存储以及会话内存)。