Node.js oauth\u问题=签名\u无效,Auoth 1.0 PUT请求
我正在尝试使用ETSY api进行api调用,以更新清单清单 我得到这个错误:oauth\u problem=signature\u invalid&debug\u sbs=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
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我已经添加了一些代码,可能有助于您跟踪情况