【问题标题】:Setting up Twitter OAuth without 3rd party libraries在没有 3rd 方库的情况下设置 Twitter OAuth
【发布时间】:2012-05-28 02:33:17
【问题描述】:

Get twitter public timeline, json+C#, no 3rd party libraries继续

我还是 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 方库:(

【问题讨论】:

    标签: c# oauth twitter-oauth sha1 hmac


    【解决方案1】:

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

    文档中有示例,设置起来非常容易。

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

    【讨论】:

    • 我之前成功地使用了 Twitterizer,但最近才意识到我不能在我的项目中使用 3rd 方库所以......你知道其余的,不过谢谢!
    【解决方案2】:

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

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

    什么是基本字符串?

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

    • 从您发送的请求的 HTTP 方法开始,大写。例如POSTGET
    • 向其中添加一个与号 (&) 字符
    • 在请求中添加您正在调用的 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"
    

    【讨论】:

    • 谢谢,这远远超出了我的要求!我会尽我所能来完成这项工作。如果我有任何进一步的问题(仍然与这个问题有关),我应该开始一个新问题还是继续在这里提问?我会在问之前尝试!另外,我如何将问题标记为已解决,或者勾选答案是否足够?再次感谢您的这篇文章!我希望它可以帮助其他尝试做同样事情的人:)
    • 如果您遇到麻烦,请在此处发表评论,我会尽力提供帮助。我们也可以使用聊天功能。此外,twitter 的开发资源是黄金,使用它们来了解 OAuth 及其 API。
    • oi45.tinypic.com/6e0mcl.jpg - baseString 和 url 编码哈希的屏幕截图 到目前为止一切都正确吗?我现在仍然只是试图完成 request_token 部分我猜 HTTP 标头是键值对的地方?我不完全确定如何创建这些,创建一个新的 httpwebrequest 对象,然后......?
    • 基本字符串看起来是正确的,只是部分之间的 & 符号不应该被编码。对各个部分进行编码,然后用 & 连接。
    • 好的,我排除了url编码方法中的&,现在如何通过授权头传递值? WebClient wc = new WebClient(); wc.Headers.Add("??","??");...??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多