2010-06-03 62 views
1

因此,我构建了一个Java脚本,该脚本与我的C++应用程序一起用于向用户发送直接消息。该脚本完成了我发送请求的工作。当我发送请求时,我收到“不正确的签名”或“无法验证你”有人看到我失踪或做错了吗?我正在继续调查。谢谢你在前进Twitter OAuth,尝试POST直接消息时出错

的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); 
+1

需要检查的一件事是确保您的服务器时间与Twitter同步。如果超过5分钟,您的请求将失败。 – abraham 2010-06-03 19:11:30

+0

我如何获得Twitter的时间? – Darxval 2010-06-03 19:28:30

+0

我一直在慢慢获得它,它不是完全工作,但是,当你调用Java脚本时,我需要花费时间以毫秒为单位。感谢亚伯拉罕! – Darxval 2010-06-08 15:25:19

回答

2

这里有一些事情要小心:

  • JavaScript的 “逃离” 功能将不能用于OAuth的URL编码工作,因为每OAuth Spec

5.1。参数编码

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

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

JavaScript的逃生功能会让@ * + /通过,转义。我相信这会破坏签名签名过程,因为服务器将会逃避这些签名过程,并且计算出的HMAC-SHA1值将与您的计算机不同。

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

我发现获取正确的编码是OAuth中最枯燥的部分。请务必在新的“url_encode”功能中使用大写字母。

这是我的C++代码来做URL编码。它可以优化一点,但应该很容易理解。

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; 
} 

祝你好运!

+0

感谢Will,编码也让我陷入困境。现在我只是慢慢调试,直到格式是Twitter需要的。谢谢你们! – Darxval 2010-06-08 15:26:02

+0

如果你不想做任何事情,只需做这个http://twitter.com/intent/tweet?text=message – GameLoading 2011-04-09 09:04:13

相关问题