在没有第三方库的情况下设置Twitter OAuth
继续获取Twitter公共时间线,json + C#,没有第三方库
我还是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-encoded”的URL,就像空格 – >“%20”一样?
总结: – 什么是基本字符串?
– 我在空间 – >%20例子吗?
-HMAC-SHA1涉及消息和密钥,是消费者秘密的消息吗? 消费者关键是关键吗?
– 如何通过使用HMAC-SHA1算法创建签名
– 如果我设法创建签名,我如何将这些值传递给Twitter?
我可以用
http://example.com?consumer_key=asdf&oauth_signature=signaturevalue&etc.,
但我已经阅读并且显然人们使用HTTP-Headers或其他东西(再次,我真的不知道这是什么)
谢谢! 同样,没有第三方图书馆允许:(
很难以简短的方式回答您的问题,因为实施完整的OAuth客户端并非易事,需要真正了解OAuth1.0a规范。 这不是火箭科学,但它确实需要整理所有的零碎。
我将尝试零碎地回答你的问题。
什么是基本字符串?
OAuth中的签名基本字符串构建如下:
- 以大写forms从您要发送的请求的HTTP方法开始。 例如
POST
或GET
。 - 添加&符号(
&
) - 添加您在请求中调用的URL编码(编码百分比)URL(此处不包含参数)
- 在这里添加另一个&符号
- 最后添加URL编码的参数字符串
我将描述如何在最后一步中创建所需的参数字符串。
收集请求中包含的所有参数。 您可以在URL中将它们作为查询字符串的一部分找到,也可以在POST
请求时在请求正文中找到它们。 例如,您要将参数parameter1=value1
POST
到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甚至会在请求正文中接受它们的某些请求。 但首选方法是通过Authorization
HTTP标头,因为它允许在协议特定参数和请求特定参数之间进行明确分离。
它应该看起来像这样(直接取自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"
如果你真的很困惑,只想要一个简单的库使用我建议看看Twitterizer
文档中有示例,设置起来非常简单。
[编辑]哎呀,抱歉只是读到你不是在寻找第三方图书馆。 抱歉