所以我正在构建一个与我的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);
答案 0 :(得分:2)
以下是一些需要注意的事项:
5.1。参数编码
所有参数名称和值均为 使用[RFC3986]转义 百分比编码(%xx)机制。 字符不在无保留 字符集([RFC3986]第2.3节) 必须编码。中的人物 无保留的字符集绝不可以 编码。中的十六进制字符 编码必须是大写的。文本 名称和值必须编码为 在百分比编码之前的UTF-8八位字节 他们按[RFC3629]。
unreserved = ALPHA, DIGIT, '-', '.', '_', '~'
JavaScript的转义函数将允许@ * + / through,unescaped。我相信这会破坏签名签名过程,因为服务器将逃避这些过程,并且它计算的HMAC-SHA1值将与您的不同。
我发现编码正确是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;
}
祝你好运!