node.jsoauthaxiosrequestoauth-1.0a

Axios and Oauth1.0 - 'status: 400, Bad Request'


I'm new on Nodejs and all the modules related with Node. I've been trying to use axios for send a Oauth1.0 Autorization signature, but i'm getting: response: { status: 400, statusText: 'Bad Request', ...}

import { BASE_URL } from '../../../config/config.js';
import axios from 'axios';
import status from 'http-status';
import OAuth from 'oauth-1.0a';
import { createHmac } from 'crypto';
import dotenv from 'dotenv';

dotenv.config();

const CONSUMERKEY = process.env.consumer_key;
const CONSUMERSECRET = process.env.consumer_secret;
const TOKENKEY = process.env.access_token;
const TOKENSECRET = process.env.token_secret;

export const oauth = OAuth({
    consumer: {
        key: CONSUMERKEY,
        secret: CONSUMERSECRET,
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return createHmac('sha1', key)
            .update(base_string)
            .digest('base64')
    },
})

export const token = {
    key: TOKENKEY,
    secret: TOKENSECRET,
}

const doRequest = async (query) => {

    const request_data = {
        url: `${BASE_URL}`,
        method: 'GET',
        params: { q: `${query}` },
    };

    const authHeader = oauth.toHeader(oauth.authorize(request_data, token));
    
    return await axios.get(request_data.url, request_data.params, { headers: authHeader });

};

const searchU = async (term) => {

    return await doRequest(`${term}`);

};


export const userS = async (req, res, next) => {
    try {
        const { query } = req;
        
        const { data } = await searchU(query.q);
        
        const string = JSON.stringify(data);

        const Rs = JSON.parse(string);

        const response = {
            code: 1,
            message: 'sucess',
            response: Rs
        };

        res.status(status.OK).send(response);

    } catch (error) {

        next(error);

        if (error.response){

            console.log("Response: ");
            console.log(error.response);
            
        } else if(error.request){
            
            console.log("Request: ");
            console.log(error.request)
            
        } else if(error.message){
            
            console.log("Message: ");
            console.log(error.message)
            
        }
        

    }
    
};

I've been also trying the solution given On this post: but there's no way I can make this work, no idea what i could be doing wron...

When i try the following code (see below), using Request module (which is deprecated) works well, but I really need to do it with Axios...

const request_data = {
    url: `${BASE_URL}`,
    method: 'GET',
    params: { q: `${query}` },
};

const authHeader = oauth.toHeader(oauth.authorize(request_data, token));

request(
  {
      url: request_data.url,
      method: request_data.method,
      form: request_data.params,
      headers: authHeader,
  },
  function(error, response, body) {
      console.log(JSON.parse(body));
  }
)

Any thoughts on what I'm doing wrong on this?? Thank you very much!!


Solution

  • Refer to the following link for the Request Config for Axios. I believe you need to have the query params after the header in the axios.get()

    Axios Request Config

    Try, the following and see how it goes:-

    return await axios.get(request_data.url, { headers: authHeader }, request_data.params);