OAuth1.0 使用 NodeJS 和 Axios - 401 错误(授权标头)

问题描述 投票:0回答:1

我一直在使用 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);
    });
node.js twitter axios postman oauth-1.0a
1个回答
0
投票

解决了。

我错过了请求对象中的一个错误。我错误地设置了“data”属性,而不是“body”属性。为了让 OAuth 实例正确使用请求对象,需要此 body 属性。至于顺序是否重要,我看到有人说重要,也有人说不重要。我实现了一个更改授权字符串顺序的函数,所以在这种情况下我仍然不确定。我倾向于选择“没关系”。按一下。

© www.soinside.com 2019 - 2024. All rights reserved.