我正在使用FatSecret REST API
我正在使用OAuthSimple javascript库来生成已签名的网址。 这是我的代码 -
params['oauth_timestamp'] = Math.floor(new Date().getTime()/1000);
params['oauth_nonce'] = '1234';
params['oauth_version'] = '1.0';
var paramStr = '';
for(var key in params){
paramStr += key+"="+params[key]+"&";
}
paramStr = paramStr.substring(0,paramStr.length-1);
var oauth = OAuthSimple();
oauth.setAction('GET');
var o = oauth.sign(
{
path:this.requestURL,
parameters: paramStr,
signatures:{
api_key:this.apiKey,
shared_secret:this.sharedSecret,
access_token: this.accessToken,
access_secret: this.accessSecret
}
});
console.log(o.signed_url);
return o.signed_url;
params是一个关联数组,包含此调用的所有非oauth相关参数。 当我使用这个签名的URL时,我得到一个“无效/使用过的nonce”
OAuth Testing Tool使用相同的OAuthSimple库,如果我输入所有相同的参数(包括时间戳),它会生成完全相同的网址。
唯一的区别是测试工具生成的url工作,并从服务器给我完整的响应。我的代码生成的网址不是。
我尝试了各种nonce值,包括发送时间戳的MD5但我得到了同样的错误。我现在使用1234的原因是默认情况下测试工具使用1234,这似乎有效。
感谢任何帮助。提前谢谢。
答案 0 :(得分:5)
使用适用于当前浏览器的内容更新@ Saravanan的答案:
function genNonce() {
const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._~'
const result = [];
window.crypto.getRandomValues(new Uint8Array(32)).forEach(c =>
result.push(charset[c % charset.length]));
return result.join('');
}
console.info(genNonce());
答案 1 :(得分:3)
根据twitter文档的nonce值:
此请求的值是由base64编码的32字节随机数据生成的,并删除所有非字字符,但任何 应该产生相对随机的字母数字字符串的方法 好在这里。
根据以上说明,我每次发送请求时都使用以下javascript代码生成nonce值:
var nonceLen = 32;
return crypto.randomBytes(Math.ceil(nonceLen * 3 / 4))
.toString('base64') // convert to base64 format
.slice(0, nonceLen) // return required number of characters
.replace(/\+/g, '0') // replace '+' with '0'
.replace(/\//g, '0'); // replace '/' with '0'
如果有效,请试试这个!
答案 2 :(得分:-2)
试试这个 这每次都有效
var nonce = Math.random()。toString(36).replace(/ [^ a-z] /,'')。substr(2);