我一直在使用 Postman 制作一个对象,我需要将其包含在使用 OAuth1.0 的 axios 请求中,Postman 成功完成了。现在我尝试在没有 Postman 的情况下完成此操作,以便我可以自动化操作,但我在使用 OAuth1.0 时遇到了问题。我正在使用 npm 包 oauth1.0a 并安装了必要的依赖项,例如 crypto。我成功地将授权标头放在请求的正确位置,但是当我记录它时,它看起来与 Postman 不同,并且参数的顺序不同。我读过的 Oauth1.0a 文档似乎表明顺序很重要,所以我不确定为什么我的文档出现问题。 这就是授权标头的样子:
'Authorization': 'OAuth oauth_consumer_key="XXX",oauth_token="XXX",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1559312415",oauth_nonce="XXX",oauth_version="1.0",oauth_signature="XXX"'
这就是我的结果(注意顺序的差异):
Authorization: 'OAuth oauth_consumer_key="XXXXXX",oauth_nonce="XXXXX",oauth_signature="XXXXXX",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1709321223",oauth_token="XXXXX",oauth_version="1.0"'
顺序重要吗?如果是这样,我该如何纠正?我做的事情还有什么问题吗?
我参考了这篇文章寻求帮助:OAuth1.0 header in Node.js
我尝试操作授权标头字符串并使事情按顺序排列。我已经两次和三次检查了我的消费者密钥和令牌,它们是正确的,因为邮递员正在使用这些并且这些请求是成功的。我尝试使我的代码尽可能与 Postman 匹配。我更改了 OAuth 实例中的参数(参数之间的“、”与“”)以及随机数的长度(Postmans oauth_nonce 为 11 个字符)。还在这里引用了 Twitter API 文档:https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request。还询问了 ChatGPT 对问题的理解。
这是相关代码,其中一些部分被抽象出来:
let data = JSON.stringify({
"text": "Hello World!"
});
const OAuth = require('oauth-1.0a');
const crypto = require('node:crypto');
// const crypto = import('node:crypto');
const oauth = OAuth({
consumer: {
key: '<key>',
secret: '<secret>'
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto.createHmac('sha1', key).update(base_string).digest('base64');
},
// nonce_length: 11,
parameter_seperator: ','
});
const token = {
key: '<tokenkey>',
secret: '<tokensecret>'
}
let request = {
url: 'https://api.twitter.com/2/tweets',
method: 'POST',
data: data
}
let authorization = oauth.authorize(request, token);
let headers = oauth.toHeader(authorization);
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.twitter.com/2/tweets',
headers: {
'Content-Type': 'application/json',
'Authorization': `${headers.Authorization}`,
'Cookie': 'guest_id=xxx; guest_id_ads=xxx; guest_id_marketing=xxx; personalization_id="xxx"'
},
data : data
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error.message);
});
解决了。
我错过了请求对象中的一个错误。我错误地设置了“data”属性,而不是“body”属性。为了让 OAuth 实例正确使用请求对象,需要此 body 属性。至于顺序是否重要,我看到有人说重要,也有人说不重要。我实现了一个更改授权字符串顺序的函数,所以在这种情况下我仍然不确定。我倾向于选择“没关系”。按一下。