7

我正在使用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;

params 是一个关联数组,包含此调用的所有非 oauth 相关参数。当我使用这个签名的网址时,我得到一个“无效/使用的随机数”

OAuth 测试工具使用相同的OAuthSimple 库,如果我输入所有相同的参数(包括时间戳),它会生成完全相同的 url。

唯一的区别是测试工具生成的 url 有效,并给了我来自服务器的完整响应。我的代码生成的网址没有。

我尝试了各种 nonce 值,包括发送时间戳的 MD5,但我得到了同样的错误。我现在使用 1234 的原因是测试工具默认使用 1234,这似乎有效。

任何帮助表示赞赏。提前致谢。

4

3 回答 3

6

使用适用于当前浏览器的内容更新@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());
于 2017-02-23T04:00:01.277 回答
3

根据 twitter 文档的 nonce 值:

此请求的值是通过对 32 字节随机数据进行 base64 编码并去除所有非单词字符生成的,但任何产生相对随机的字母数字字符串的方法在这里都应该没问题。

基于以上注释,我每次发送请求时都使用以下 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'

如果它有效,试试这个!

于 2014-07-16T09:37:08.313 回答
-2

试试这个
每次都有效

var nonce = Math.random().toString(36).replace(/[^az]/, '').substr(2);

于 2017-02-07T15:07:13.070 回答