首页 > 解决方案 > Axios 和 Oauth1.0 - '状态:400,错误请求'

问题描述

我是 Nodejs 和所有与 Node 相关的模块的新手。我一直在尝试使用 axios 发送 Oauth1.0 Autorization 签名,但我得到: 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)
            
        }
        

    }
    
};

我也一直在尝试在这篇文章中给出的解决方案:但我无法完成这项工作,不知道我会做错什么......

当我尝试以下代码(见下文)时,使用请求模块(已弃用)效果很好,但我真的需要用 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));
  }
)

关于我在这方面做错了什么有什么想法吗?非常感谢你!!

标签: node.jsoauthaxiosrequestoauth-1.0a

解决方案


有关 Axios 的请求配置,请参阅以下链接。我相信您需要在 axios.get() 的标头之后添加查询参数

Axios 请求配置

试试下面的,看看它是怎么回事: -

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

推荐阅读