很难以简短的方式回答您的问题,因为实现完整的 OAuth 客户端并非易事,并且需要真正了解 OAuth1.0a 规范。这不是火箭科学,但它确实需要整理所有的点点滴滴。
我将尝试逐条回答您的问题。
什么是基本字符串?
OAuth 中的签名基本字符串是这样构建的:
- 从您发送的请求的 HTTP 方法开始,大写。例如
POST 或GET。
- 向其中添加一个与号 (
&) 字符
- 在请求中添加您正在调用的 URL 编码(百分比编码)URL(此处不要包含参数)
- 在此处再添加一个与号 (
&) 字符
- 最后添加 URL 编码的参数字符串
我将描述如何在最后一步创建您需要的参数字符串。
收集请求中包含的所有参数。当您是POST-ing 请求时,您可以在 URL 中作为查询字符串的一部分找到它们,也可以在请求正文中找到它们。例如,假设您是 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 甚至在某些请求的请求正文中接受它们。但首选方式是通过Authorization HTTP 标头,因为它允许明确区分协议特定参数和请求特定参数。
它应该看起来有点像这样(直接来自OAuth 1.0a spec):
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"