Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js oauth\u问题=签名\u无效,Auoth 1.0 PUT请求_Node.js_Oauth_Etsy - Fatal编程技术网

Node.js oauth\u问题=签名\u无效,Auoth 1.0 PUT请求

Node.js oauth\u问题=签名\u无效,Auoth 1.0 PUT请求,node.js,oauth,etsy,Node.js,Oauth,Etsy,我正在尝试使用ETSY api进行api调用,以更新清单清单 我得到这个错误:oauth\u problem=signature\u invalid&debug\u sbs=PUT 我的代码是: const request = require('request') const OAuth = require('oauth-1.0a') const crypto = require('crypto') let data ='produts data'; // Initialize const

我正在尝试使用ETSY api进行api调用,以更新清单清单

我得到这个错误:oauth\u problem=signature\u invalid&debug\u sbs=PUT

我的代码是:

const request = require('request')
const OAuth = require('oauth-1.0a')
const crypto = require('crypto')

let data ='produts data';


// Initialize
const oauth = OAuth({
    consumer: {
        key: api_key,
        secret: secret
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return crypto
            .createHmac('sha1', key)
            .update(base_string)
            .digest('base64')
    },
})
const request_data = {
    url: url,
    method: 'PUT',
    data: {
        products: data.products,
        price_on_property: [513],
        quantity_on_property: [513],
        sku_on_property: [513]
    },
}

// Note: The token is optional for some requests
const token = {
    key: access_token,
    secret: access_token_secret,
}
request({
    url: request_data.url,
    method: request_data.method,
    form: request_data.data,
    headers: oauth.toHeader(oauth.authorize(request_data, token)),
},
    function (error, response, body) {
        console.log(response.body)
    });

我的代码中缺少什么吗?

Etsy API要求文章正文中包含oauth参数,而不是标题。文档对此不是很清楚,但有点暗示()

因此,您的请求呼叫应如下所示:

request({
    url: request_data.url,
    method: request_data.method,
    form: oauth.authorize(request_data, token)
},
function (error, response, body) {
    console.log(response.body)
});
调试此类问题的一个好工具是Postman()。这就是我如何找到这个问题的原因

编辑:

如果请求在Postman中运行,但您仍然无法在代码中运行,那么您可以稍微中断该过程。通过调用oauth对象上的nonce、timestamp和signature方法手动构建oauth参数

let oauth_data = {
    oauth_consumer_key: api_key,
    oauth_nonce: oauth.getNonce(),
    oauth_signature_method: "HMAC-SHA1",
    oauth_timestamp: oauth.getTimeStamp(),
    oauth_version: "1.0",
    oauth_token: access_token
 };
 //now generate the signature using the request data and the oauth object
 //you've just created above
 let signature = oauth.getSignature(request_data,token_secret,oauth_data);
 //now add the signature to the oauth_data paramater object
 oauth_data.oauth_signature = signature;


 //merge two objects into one
 let formData = Object.assign({},oauth_data,request_data.params);

 request({
    url: request_data.url,
    method: request_data.method,
    form: formData
 },
 function (error, response, body) {
    console.log(response.body)
 });
我在代码中发现,在启动oauth对象时,我错误地命名了consumer.secret变量。因此,消费者机密为空,因此签名出现错误


另外,尝试一个更简单的PUT调用,以测试您的基本PUT请求是否有效。我正在做
updateShop
来更新店铺名称(实际上你可以将其更新为现有的名称,因此不需要更改任何内容),它只需要你的店铺id和标题字符串。

我已经尝试过了,但我仍然没有工作。我知道这是我开始与邮递员测试我的请求的时候了。如果它对邮递员有效,那就是你的代码有问题。如果没有,则可能是您的请求有问题。@Kamal_mod我已经添加了一些代码,可能有助于您跟踪情况