Twitter OAuth,尝试POST直接消息时出错

时间:2010-06-03 17:51:55

标签: javascript twitter oauth

所以我正在构建一个与我的C ++应用程序结合使用的java脚本,用于向用户发送直接消息。该脚本完成构建我发送的请求的工作。当我发送请求时,我收到“不正确的签名”或“无法验证您”有没有人看到我错过的或做错了什么?我正在继续调查。提前谢谢

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 个答案:

答案 0 :(得分:2)

以下是一些需要注意的事项:

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

5.1。参数编码

     

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

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

JavaScript的转义函数将允许@ * + / through,unescaped。我相信这会破坏签名签名过程,因为服务器将逃避这些过程,并且它计算的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;
}

祝你好运!