gpt4 book ai didi

javascript - Twitter OAuth,尝试发布直接消息时出错

转载 作者:行者123 更新时间:2023-11-30 18:53:33 26 4
gpt4 key购买 nike

因此,我正在构建一个 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);

最佳答案

这里有一些需要注意的事情:

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

5.1. Parameter Encoding

All parameter names and values are escaped using the [RFC3986] percent-encoding (%xx) mechanism. Characters not in the unreserved character set ([RFC3986] section 2.3) MUST be encoded. Characters in the unreserved character set MUST NOT be encoded. Hexadecimal characters in encodings MUST be upper case. Text names and values MUST be encoded as UTF-8 octets before percent-encoding them per [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;
}

祝你好运!

关于javascript - Twitter OAuth,尝试发布直接消息时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com