【问题标题】:Twitter OAuth, Error when trying to POST direct messageTwitter OAuth,尝试发布直接消息时出错
【发布时间】:2011-02-27 10:49:28
【问题描述】:

所以我正在构建一个 java 脚本,它与我的 C++ 应用程序一起用于向用户发送直接消息。该脚本负责构建我发送的请求。当我发送请求时,我收到“签名不正确”或“无法验证您的身份”是否有人看到我遗漏或做错了什么?我正在继续调查。提前谢谢你

Javascript:

var nDate = new Date();
var epoch = nDate.getTime();
var nounce = "";

nounce = Base64.encode(epoch+randomString()); 

var Parameters =   [
   "oauth_consumerkey="+sConsumerKey,
   "oauth_nonce="+nounce,
   "oauth_signature_method=HMAC-SHA1",
   "oauth_timestamp="+epoch,
   "oauth_token="+sAccessToken,
   "oauth_version=1.0",
   "text="+sText,
   "user="+sUser];

var SortedParameters = Parameters.sort(); 
var joinParameters = SortedParameters.join("&");
var encodeParameters = escape(joinParameters);



signature_base_string = escape("POST&"+NormalizedURL+"&"+encodeParameters);

signature_key = sConsumerSecret+"&"+sAccessSecret;

signature = Base64.encode(hmacsha1(signature_base_string,signature_key));


sAuthHeader = "
  OAuth realm=, 
  oauth_nonce="+nounce+",
  oauth_timestamp="+epoch+",     
  oauth_consumer_key="+sConsumerKey+",
  oauth_signature_method=HMAC-SHA1, 
  oauth_version=1.0,
  oauth_signature="+signature+",
  oauth_token="+sAccessToken+",
  text="+sText;

goNVOut.Set("Header.Authorization: ", sAuthHeader);

【问题讨论】:

  • 要检查的一件事是确保您的服务器时间与 Twitter 的时间同步。如果超过 5 分钟,您的请求将失败。
  • 如何获取 Twitter 的时间?
  • 我一直在慢慢地得到它,它不是完全有效的,但是当你调用 Java 脚本获取时间时,我以毫秒为单位拉动纪元时间。谢谢亚伯拉罕!

标签: javascript twitter oauth


【解决方案1】:

以下几点需要注意:

  • 根据OAuth Spec,JavaScript 的“转义”功能不适用于 OAuth URL 编码。

5.1。参数编码

所有参数名称和值都是 使用 [RFC3986] 转义 百分比编码 (%xx) 机制。 未保留的字符 字符集([RFC3986] 第 2.3 节) 必须编码。中的人物 不可保留的字符集 编码。十六进制字符 编码必须是大写。文本 名称和值必须编码为 百分比编码前的 UTF-8 八位字节 根据 [RFC3629]。

        unreserved = ALPHA, DIGIT, '-', '.', '_', '~'

JavaScript 的转义函数会让@*+/ 通过,未转义。我相信这会破坏签名签名过程,因为服务器会转义这些,并且它计算的 HMAC-SHA1 值将与您的不同。

  • 请务必对您的基本 URI(NormalizedURL)进行 URL 编码。

我发现正确编码是 OAuth 中最乏味的部分。确保在新的“url_encode”函数中使用大写字母。

这是我进行 URL 编码的 C++ 代码。可以稍微优化一下,但应该很容易理解。

char hexdigit(int ch)
{
    assert(ch < 16);
    assert(ch >= 0);
    if (ch >= 10)
        return 'A' + ch - 10;
    return '0' + ch;
}

std::string url_encode(const std::string &to_encode)
{
    std::stringstream ss;
    for (std::string::const_iterator ich = to_encode.begin();
         ich != to_encode.end();
         ++ich)
    {
        unsigned char ch = (unsigned char)*ich;
        if (isalpha(ch) || isdigit(ch) || ch == '-' || ch == '_' || ch == '.' || ch == '~')
        {
            ss << ch;
        }
        else
        {
            ss << '%';
            ss << hexdigit(ch >> 4);
            ss << hexdigit(ch & 0xf);
        }
    }

    std::string encoded = ss.str();
    return encoded;
}

祝你好运!

【讨论】:

  • 谢谢 Will,编码也给我带来了麻烦。现在我只是在慢慢调试,直到格式是 Twitter 需要的。谢谢你们!!!
  • 如果你不想做任何事情,就这样做twitter.com/intent/tweet?text=message
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2012-06-07
  • 2011-09-17
相关资源
最近更新 更多