6

继续获取 twitter 公共时间线,json+C#,无 3rd 方库

我还是 C# 和 oAuth 的新手,所以如果我什么都不懂,请多多包涵

我创建了一个名为 oAuthClass 的 C# 类,这些是我目前拥有的变量:

    static class oAuthClass
{
    public static void run()
    {
        int oauth_timestamp = GetTimestamp(DateTime.Now);
        string oauth_nonce = PseudoRandomStringUsingGUID();
        string oauth_consumer_key = "consumer key here";
        string oauth_signature_method = "HMAC-SHA1";
        string oauth_version = "1.0";
    }
}

我已经阅读了 OAuth 签名,我现在选择使用 HMAC-SHA1,我不知道如何生成签名,在阅读和看到诸如 HTTP-Encodings 和 Base-Strings 之类的东西后我也非常困惑等等(我根本不知道它们是什么意思),但我的猜测是创建一个“Http 编码”的 URL,比如空格->“%20”?

总而言之:-什么是基本字符串?

-我在空格->%20 示例上是否正确?

-HMAC-SHA1 涉及消息和密钥,消费者对消息保密吗?那么消费者钥匙是钥匙吗?

-如何通过使用 HMAC-SHA1 算法创建签名

- 如果我确实创建了签名,我如何将这些值传递给 Twitter?

我可以使用

http://example.com?consumer_key=asdf&oauth_signature=signaturevalue&etc., 

但我读过并且显然人们使用 HTTP-Headers 或其他东西(同样,我真的不知道这是什么)

谢谢!同样,不允许使用 3rd 方库:(

4

2 回答 2

14

很难以简短的方式回答您的问题,因为实现完整的 OAuth 客户端并非易事,并且需要真正了解 OAuth1.0a 规范。这不是火箭科学,但它确实需要整理所有的点点滴滴。

我将尝试逐条回答您的问题。

什么是基本字符串?

OAuth 中的签名基本字符串是这样构建的:

  • 从您发送的请求的 HTTP 方法开始,大写。例如POSTGET
  • 向其中添加与号 ( &) 字符
  • 添加您在请求中调用的 URL 编码(百分比编码)URL(此处不要包含参数)
  • 在此处添加另一个与号 ( &) 字符
  • 最后添加 URL 编码的参数字符串

我将描述如何在最后一步创建您需要的参数字符串。

收集请求中包含的所有参数。您可以在 URL 中作为查询字符串的一部分找到它们,也可以在您执行请求时在请求正文中找到它们POST。例如,假设您正在POST将参数parameter1=value1添加到 URL http://example.com/?parameter2=value2。这使得包含两个参数。

现在,您还必须总结协议满意所需的所有 OAuth 参数。这些将导致参数列表看起来像这样:

  • oauth_consumer_key=fffffaaaafffaaaff
  • oauth_nonce=aaaaabbbbbcccccaaaaudi2313
  • oauth_signature_method=HMAC-SHA1
  • oauth_timestamp=1319633599
  • oauth_token=bbbbbbbbbfsdfdsdfsfserwerfsddffdsdf
  • oauth_version=1.0
  • parameter1=value1
  • parameter2=value2

所有这些单独的字符串都需要按参数名称按字典顺序排序(按字母顺序就足够了),并连接成一个字符串。那是你的参数字符串。

我在空格->%20 示例上是否正确?

是的。您在谈论百分比编码,它也称为 HTTP 编码和 URL 编码。http://en.wikipedia.org/wiki/Percent-encoding

HMAC-SHA1 涉及到消息和密钥,消费者对消息是保密的吗?那么消费者钥匙是钥匙吗?

该消息是您在上面创建的签名基本字符串。关键是你的消费者秘密和你的访问令牌秘密的组合。所以键应该是这样的:(CONSUMER_SECRET&TOKEN_SECRET注意与号)。在您执行的绝对第一个请求中,您还没有令牌秘密,那么密钥只有CONSUMER_SECRET&(再次注意&符号)。

如何通过使用 HMAC-SHA1 算法创建签名。

我从http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs获取了这个,并且假定秘密和基本字符串可用于代码。

基本上为 HMACSHA1 实例提供密钥和消息,呈现该哈希并将其转换为 base64 字符串。

HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", UrlEncode(consumerSecret), string.IsNullOrEmpty(tokenSecret) ? "" : UrlEncode(tokenSecret)));
byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(signatureBaseString);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);

return Convert.ToBase64String(hashBytes);

如果我确实设法创建了签名,我如何将这些值传递给 Twitter?

您应该能够轻松研究什么是 HTTP 标头。

但是您可以选择将参数和签名的最终结果添加到 URL,我认为 Twitter 甚至在某些请求的请求正文中接受它们。但首选方式是通过AuthorizationHTTP 标头,因为它允许明确区​​分协议特定参数和请求特定参数。

它应该看起来像这样(直接取自OAuth 1.0a 规范):

Authorization: OAuth realm="Example",
    oauth_consumer_key="0685bd9184jfhq22",
    oauth_token="ad180jjd733klru7",
    oauth_signature_method="HMAC-SHA1",
    oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
    oauth_timestamp="137131200",
    oauth_nonce="4572616e48616d6d65724c61686176",
    oauth_version="1.0"
于 2012-05-21T19:35:46.577 回答
0

如果您真的很困惑并且只想使用一个简单的库,我建议您查看Twitterizer

那里的文档有示例,而且很容易设置。

[编辑] 哎呀,抱歉刚刚读到您不是在寻找第 3 方库。对不起

于 2012-05-21T15:31:51.243 回答