在没有第三方库的情况下设置Twitter OAuth

Pro*_*tus 6 c# sha1 oauth hmac 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我对OAuth的签名读了,我选择使用HMAC-SHA1现在,我不知道如何生成签名,我也极其混乱阅读和看到的东西,如HTTP,编码和基地级串什么(我根本不知道他们的意思),但我的猜测是创建一个"Http编码"的URL,如空格 - >"%20"?

总结: - 什么是基本字符串?

- 我对这个空间 - >%20例子?

-HMAC-SHA1涉及消息和密钥,是消费者秘密的消息吗?消费者关键是关键吗?

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

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

我可以用

http://example.com?consumer_key=asdf&oauth_signature=signaturevalue&etc., 
Run Code Online (Sandbox Code Playgroud)

但我已经阅读并且显然人们使用HTTP-Headers或其他东西(再次,我真的不知道这是什么)

谢谢!同样,没有第三方图书馆允许:(

Jon*_*der 14

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

我将尝试零碎地回答你的问题.

什么是基本字符串?

OAuth中的签名基本字符串构建如下:

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

我将描述如何在最后一步中创建所需的参数字符串.

收集请求中包含的所有参数.您可以在URL中将它们作为查询字符串的一部分找到,也可以在请求时在请求正文中找到它们POST.比如说你是POST-ing参数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);
Run Code Online (Sandbox Code Playgroud)

如果我设法创建签名,我如何将这些值传递给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"
Run Code Online (Sandbox Code Playgroud)