OAuth 1.0将Consumer Secret转换为oauth_signature

问题描述

我正在尝试使用我的MERN应用程序实现Twitter登录。在Twitter教程之后,我了解所有请求都应使用OAuth标头签名。如果我使用邮递员,则在授权选项卡中输入我的凭据(“消费者密钥”,“消费者秘密”),该呼叫将起作用。问题是邮递员在发送呼叫之前将Consumer机密转换为和oauth_signature。现在我想在Node.js中执行此工作流程。所有在线教程都使用复杂的护照策略,并使用了描述的请求模块。我知道要生成oauth_signature,必须先生成oauth_nonce然后执行: 百分比对将要签名的每个键和值进行编码。 通过编码键[2]按字母顺序[1]对参数列表进行排序。 对于每个键/值对: 将编码的密钥附加到输出字符串。 在输出字符串后附加'='字符。 将编码值附加到输出字符串。 如果还有更多的键/值对,请在输出字符串后附加一个'&'字符。

我敢肯定,所有这一切都会重新发明轮子,并且很确定有一个模块可以执行此步骤,而无需所有护照和身份验证(这已经在我的应用程序中完成了),我只需要签署我的Twitter请求像邮递员一样,无所事事。

我尝试了以下操作,但似乎仍在做错事

  var axios = require('axios');
  const jsSHA = require('jssha/sha1');
  //Am i using the right library??

      const callBackUL = 'https%3A%2F%2F127.0.0.1%3A3000%2Flogin';
      var oauth_timestamp = Math.round(new Date().getTime() / 1000.0);
      const nonceObj = new jsSHA('SHA-1','TEXT',{ encoding: 'UTF8' });
      nonceObj.update(Math.round(new Date().getTime() / 1000.0));
      const oauth_nonce = nonceObj.getHash('HEX');
      const endpoint = 'https://api.twitter.com/oauth/request_token';
      const oauth_consumer_key = process.env.TWITTER_API_KEY;
      const oauth_consumer_secret = process.env.TWITTER_API_SECRET;
    
      var requiredParameters = {
        oauth_consumer_key,oauth_nonce,oauth_signature_method: 'HMAC-SHA1',oauth_timestamp,oauth_version: '1.0'
      };
    
      const sortString = requiredParameters => {
        var base_signature_string = 'POST&' + encodeURIComponent(endpoint) + '&';
        var requiredParameterKeys = Object.keys(requiredParameters);
        for (var i = 0; i < requiredParameterKeys.length; i++) {
          if (i == requiredParameterKeys.length - 1) {
            base_signature_string += encodeURIComponent(
              requiredParameterKeys[i] +
                '=' +
                requiredParameters[requiredParameterKeys[i]]
            );
          } else {
            base_signature_string += encodeURIComponent(
              requiredParameterKeys[i] +
                '=' +
                requiredParameters[requiredParameterKeys[i]] +
                '&'
            );
          }
        }
        return base_signature_string;
      };
    
      const sorted_string = sortString(requiredParameters);
      console.log('Sorted string:',sorted_string);
    
      const signing = (signature_string,consumer_secret) => {
        let hmac;
        if (
          typeof signature_string !== 'undefined' &&
          signature_string.length > 0
        ) {
          //console.log('String OK');
          if (
            typeof consumer_secret !== 'undefined' &&
            consumer_secret.length > 0
          ) {
            // console.log('Secret Ok');
    
            const secret = consumer_secret + '&';
            var shaObj = new jsSHA('SHA-1',{
              hmacKey: { value: secret,format: 'TEXT' }
            });
            shaObj.update(signature_string);
    
            hmac = encodeURIComponent(shaObj.getHash('B64'));
    
            //var hmac_sha1 = encodeURIComponent(hmac);
          }
        }
        return hmac;
      };
    
      const signed = signing(sorted_string,oauth_consumer_secret);
      console.log(signed);
    
      var data = {};
      var config = {
        method: 'post',url: endpoint,headers: {
          Authorization: `OAuth oauth_consumer_key=${process.env.TWITTER_API_KEY},oauth_signature_method="HMAC-SHA1",oauth_timestamp=${oauth_timestamp},oauth_nonce=${oauth_nonce},oauth_version="1.0",oauth_callback=${callBackUL},oauth_consumer_secret=${signed}`,'Content-Type': 'application/json'
        },data: data
      };
      try {
        const response = await axios(config);
        console.log(JSON.stringify(response.data));
      } catch (err) {
        console.log(err.response.data);
      }
    
      next();
    });

解决方法

已解决

var axios = require('axios');
  const jsSHA = require('jssha/sha1');

 const callBackUL = 'https%3A%2F%2F127.0.0.1%3A3000%2Flogin';
  var oauth_timestamp = Math.round(new Date().getTime() / 1000.0);
  const nonceObj = new jsSHA('SHA-1','TEXT',{ encoding: 'UTF8' });
  nonceObj.update(Math.round(new Date().getTime() / 1000.0));
  const oauth_nonce = nonceObj.getHash('HEX');
  const endpoint = 'https://api.twitter.com/oauth/request_token';
  const oauth_consumer_key = process.env.TWITTER_API_KEY;
  const oauth_consumer_secret = process.env.TWITTER_API_SECRET;

  var requiredParameters = {
    oauth_callback: callBackUL,oauth_consumer_key,oauth_nonce,oauth_signature_method: 'HMAC-SHA1',oauth_timestamp,oauth_version: '1.0'
  };

  const sortString = requiredParameters => {
    var base_signature_string = 'POST&' + encodeURIComponent(endpoint) + '&';
    var requiredParameterKeys = Object.keys(requiredParameters);
    for (var i = 0; i < requiredParameterKeys.length; i++) {
      if (i == requiredParameterKeys.length - 1) {
        base_signature_string += encodeURIComponent(
          requiredParameterKeys[i] +
            '=' +
            requiredParameters[requiredParameterKeys[i]]
        );
      } else {
        base_signature_string += encodeURIComponent(
          requiredParameterKeys[i] +
            '=' +
            requiredParameters[requiredParameterKeys[i]] +
            '&'
        );
      }
    }
    return base_signature_string;
  };

  const sorted_string = sortString(requiredParameters);
  console.log('Sorted string:',sorted_string);

  const signing = (signature_string,consumer_secret) => {
    let hmac;
    if (
      typeof signature_string !== 'undefined' &&
      signature_string.length > 0
    ) {
      //console.log('String OK');
      if (
        typeof consumer_secret !== 'undefined' &&
        consumer_secret.length > 0
      ) {
        // console.log('Secret Ok');

        const secret = encodeURIComponent(consumer_secret) + '&';

        var shaObj = new jsSHA('SHA-1',{
          hmacKey: { value: secret,format: 'TEXT' }
        });
        shaObj.update(signature_string);

        hmac = encodeURIComponent(shaObj.getHash('B64'));
      }
    }
    return hmac;
  };

  const signed = signing(sorted_string,oauth_consumer_secret);
  console.log(signed);

  var data = {};
  var config = {
    method: 'post',url: endpoint,headers: {
      Authorization: `OAuth oauth_consumer_key=${process.env.TWITTER_API_KEY},oauth_nonce=${oauth_nonce},oauth_signature=${signed},oauth_signature_method="HMAC-SHA1",oauth_timestamp=${oauth_timestamp},oauth_version="1.0",oauth_callback=${callBackUL}`,'Content-Type': 'application/json'
    },data: data
  };
  try {
    const response = await axios(config);
    console.log(JSON.stringify(response.data));
  } catch (err) {
    console.log(err.response.data);
  }

  next();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...