为并行请求生成oAuth nonce

时间:2014-08-09 15:58:50

标签: node.js api oauth

我正在以并行方式请求Bitstamp API:

// Simplified version

var async = require('async');
var bitstamp = require('bitstamp');

async.parallel([
    bitstamp.balance,
    bitstamp.ticker
    // ...
],
function() (err, result) {
    // process results
});

这两种方法是向Bitstamp API发送已签名的请求,包括 nonce

  

Nonce是一个常规整数。它必须随着你提出的每一个要求而增加。在这里阅读更多相关信息。示例:如果在第一个请求中将nonce设置为1,则必须在第二个请求中将其设置为至少2。您不需要从1开始。通常的做法是对该参数使用unix时间。

底层库生成nonce传统方式:

var nonce = new Date().getTime() + '' + new Date().getMilliseconds();

问题

由于异步API调用,有时nonce生成的毫秒数相同,而远程端则希望它们增加。

问题

保持并行请求,是否可以可靠地生成顺序nonce?

我明显的尝试:

this.nonce = new Date().getTime() + '' + new Date().getMilliseconds(); 
// ... on request
var nonce = this.nonce++;

但它并没有解决问题,相同的毫秒只增加了一个,但仍然相等。

3 个答案:

答案 0 :(得分:3)

(这里是npm模块的作者)

我通过在ms时间戳结束时添加自己的计数器来解决它。它现在支持每ms最多999个呼叫because of this function。第一次生成类似1409074885767000的内容,如果您在同一个ms中需要新的nonce,则会生成14090748857670011409074885767002,...

答案 1 :(得分:1)

我有完全相同的问题,所以我采用了askmike的代码并略微修改了它。

var nonce = new (function() {

    this.generate = function() {

        var now = Date.now();

        this.counter = (now === this.last? this.counter + 1 : 0);
        this.last    = now;

        // add padding to nonce
        var padding = 
            this.counter < 10 ? '000' : 
                this.counter < 100 ? '00' :
                    this.counter < 1000 ?  '0' : '';

        return now+padding+this.counter;
    };
})();

像这样使用

nonce.generate();

查看我的jsfiddle with example

答案 2 :(得分:-1)

npm nonce模块现在正确生成