gpt4 book ai didi

javascript - 推特 OAuth1.0A Javascript 错误

转载 作者:行者123 更新时间:2023-11-30 06:41:03 25 4
gpt4 key购买 nike

我目前正按照此处描述的方法为 Twitter 整合授权功能:https://dev.twitter.com/docs/auth/implementing-sign-twitter .我正在使用 Ajax 发送我的 POST“http”请求,但我一直遇到“401:未经授权”错误。我的代码如下:

function getTweets() {
var time = generateTimestamp();
var nonce = generateNonce();
var signature = generateSignature(time, nonce);
var headers = {
"Authorization": 'OAuth oauth_callback="http%3A%2F%2Fwww.google.com%2F", oauth_consumer_key="eEeAAz9fakedtAOlIUhPgQ", oauth_nonce="bbc34b2ca6faabogus6dfc025907fa334", oauth_signature="' + signature + '", oauth_signature_method="HMAC-SHA1", oauth_timestamp="' + time + '", oauth_version="1.0"'
};

$.ajax({
type: "POST",
url: "https://api.twitter.com/oauth/request_token",
dataType: "text",
headers: headers,
success: function(data) {
alert("Success!");
console.log(data);
},
error: function(jq) {
alert("Request Failed.");
console.log(jq.statusText);
}
});
}

function generateTimestamp() {
var currentTime = new Date;
currentTime = Math.floor(currentTime.getTime() / 1000);
return currentTime;
}

function generateNonce() {
var code = "";
for (var i = 0; i < 20; i++) {
code += Math.floor(Math.random() * 9).toString();
}
return code;
}

function generateSignature(timestamp, nonce) {
var http_method = "POST";
var base_url = "https://api.twitter.com/oauth/request_token";
var consumer_key = "eEeAAz9hUKtdjunkeIUhPgQ";
var consumer_secret = "c7wHxnjubxVDcc5hYFqnotactuallymysecretWs2XazUFde0lPRBtBQ";
var signature_method = "HMAC-SHA1";
var token = "609493744-kNPzLKSI4Hg9NWQnopeFPb91eXFUutFm1nZ2hDk2";
var token_secret = "15WOJS9Ji1AXsKRkyAZrxKdsalted5Gj5ZyEAb9aVrJxI";
var version = "1.0";
var parameter_string = "oauth_callback=" + encodeURIComponent(base_url) + "&oauth_consumer_key=" + consumer_key + "&oauth_nonce=" + nonce + "&oauth_consumer_key=" + consumer_key + "&oauth_signature_method=" + signature_method + "&oauth_timestamp=" + timestamp +"&oauth_version=" + version;
var base_string = http_method + "&" + encodeURIComponent(base_url) + "&" + encodeURIComponent(parameter_string);
var signing_key = encodeURIComponent(consumer_secret) + "&";
var signature = encodeURIComponent(window.btoa(CryptoJS.HmacSHA1(base_string, signing_key)));
alert(signature);
return signature;
}

如果有任何其他信息可以使此错误更清楚,请随时在下面发布。谢谢。

最佳答案

我创建了一个 node.js 库来处理 Twitter OAuth dance 和 API。代码是here, tweeter.js

欢迎您浏览创建 header 和签名的逻辑(从 348 行开始)

我在您发布的代码中没有看到的一件事会产生巨大的不同,那就是必须生成签名字符串以包含原始 header ,然后必须重建 使用生成的字符串。这是一个巨大的痛苦,我花了一段时间才弄明白。

虽然我编写的代码是针对 node.js 的,但您应该能够重用很多逻辑来满足您的需求。

编辑
我发现一个名为 hueniverse 的站点很好地记录了 OAuth。事实上,有一个实用程序 here 可以构建您自己的 header 以验证您的逻辑(选择“创建您自己的”单选按钮)。

编辑 2

为了更好地解释在 header 中包含 oauth_signature 值,假设您拥有到目前为止的所有数据:

var headerObj = {
oauth_consumer_key="123456789",
oauth_token="11111",
oauth_nonce="asdfghjkl%3B",
oauth_timestamp="1341852000",
oauth_signature_method="HMAC-SHA1",
oauth_version="1.0"
};

您创建 HMAC-SHA1 签名并收到:"jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"

然后您可以将该返回值添加到 headerObj,从而:

headerObj = {
oauth_consumer_key="123456789",
oauth_token="11111",
oauth_nonce="asdfghjkl%3B",
oauth_timestamp="1341852000",
oauth_signature_method="HMAC-SHA1",
oauth_version="1.0",
oauth_signature="jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"
};

headerObj 的这个修改版本是您构建 HTTP header 的基础。

GET / HTTP/1.1
Host: api.twitter.com:443
Authorization: OAuth realm="https://api.twitter.com/",
oauth_consumer_key="123456789",
oauth_token="11111",
oauth_nonce="asdfghjkl%3B",
oauth_timestamp="1341852000",
oauth_signature_method="HMAC-SHA1",
oauth_version="1.0",
oauth_signature="jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"

注意:我没有验证主机/领域/端口,所以这些可能是错误的。检查这些 API。

这样做的原因是在 Twitter 方面(这是一个 OAuth 实现细节),oauth_signature 值被删除, header 的其余部分被散列,并将其返回值与在 oauth_signature 中发送的值。这有点像信封上的蜡封……如果 header 其余部分的哈希值与您在 oauth_signature 中发送的哈希值不匹配,Twitter 就会知道不信任发件人或内容。

编辑 2.5

我正在将此从评论移至答案。

如果您查看 tweeter.js 中的 this line,您会看到其中的逻辑。

   var signature = self.oauthSignature(method, path, headerObj, query);
headerObj.oauth_signature = qs.escape(signature);

// concat the header object into a csv string
var header = 'OAuth realm="Twitter API",';
var oauthParts = [];
for (var h in headerObj) {
oauthParts.push(h + '="'+headerObj[h]+'"');
}
header+= oauthParts.join(',');

//...

return header;

这段代码就像我在 EDIT 2 中解释的那样,通过将 JSON 对象转换为存储在 oauthParts[] 中的 key="value" 字符串,然后将该数组中的每个元素连接成一个以逗号分隔的字符串,该字符串以 OAuth realm="Twitter API",

开头

关于javascript - 推特 OAuth1.0A Javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270708/

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