我正在使用FatSecret REST API
我使用OAuthSimple javascript库来生成签名的URL.这是我的代码 -
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;
Run Code Online (Sandbox Code Playgroud)
params是一个关联数组,包含此调用的所有非oauth相关参数.当我使用这个签名的网址时,我得到一个"无效/使用过的nonce"
该OAuth的测试工具使用相同的OAuthSimple库,如果我把所有相同的参数(包括时间戳)它产生完全相同的网址.
唯一的区别是测试工具生成的url工作,并从服务器给我完整的响应.我的代码生成的网址不是.
我尝试了各种nonce值,包括发送时间戳的MD5,但我得到了同样的错误.我现在使用1234的原因是默认情况下测试工具使用1234,这似乎有效.
任何帮助表示赞赏.提前致谢.
使用适用于当前浏览器的内容更新@ 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());
Run Code Online (Sandbox Code Playgroud)
小智 4
根据 Twitter 文档的随机数值:
该请求的值是通过对 32 字节随机数据进行 base64 编码并去除所有非单词字符生成的,但任何生成相对随机的字母数字字符串的方法在这里都应该没问题。
基于上面的注释,我使用以下 JavaScript 代码在每次发送请求时生成随机数值:
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'
Run Code Online (Sandbox Code Playgroud)
试试这个如果有效的话!
| 归档时间: |
|
| 查看次数: |
9501 次 |
| 最近记录: |