Node.js 为用户id生成随机唯一令牌

Node.js 为用户id生成随机唯一令牌,node.js,express,Node.js,Express,我想生成令牌作为用户id并存储在数据库中,但是如何生成唯一的令牌呢 我是否应该添加时间戳var currentUnixTimestamp=(new Date().getTime()/1000)作为盐?如何处理加密 var generateToken = function() { return new Promise(function (fulfill, reject){ crypto.randomBytes(8, function(error, buf) {

我想生成令牌作为用户id并存储在数据库中,但是如何生成唯一的令牌呢

我是否应该添加时间戳
var currentUnixTimestamp=(new Date().getTime()/1000)作为盐?如何处理加密

var generateToken = function() {
      return new Promise(function (fulfill, reject){
        crypto.randomBytes(8, function(error, buf) {
          if (error) {
            reject(error);
          } else {
            var token = buf.toString('hex');
            fulfill(token);
          }
        });
      });
    };

来自正确种子加密库的八个随机字节发生冲突的可能性很低,因此您通常不需要担心重复。事实上,把它增加到16字节,和你的代码是一致的。这被认为是UUID的标准。碰撞的可能性非常小,通常不值得考虑


如果你要走那么远,考虑使用一个标准格式UUID,比如。还有一些数据库端uuid函数,您可以将其作为默认值添加到架构中,例如。其优点是为您的ID提供了一种标准化且易于理解的格式,您无需花费任何时间来证明或维护您的代码,只需将开发人员指向标准文档即可。

这就是我认为我们可以使用加密生成随机令牌的方法:

var passwordResetToken = createRandomToken(data.body.email);

exports.createRandomToken = function (string) {
  var seed = crypto.randomBytes(20);
  return crypto.createHash('abcde').update(seed + string).digest('hex');
};

如果您希望此令牌用于身份验证,则应改用json web令牌。它将为您管理,而且非常有效。 只需将其作为中间件包含

app.use(expressJWT({
        secret: new Buffer("Your-secret-key").toString('base64')
    }).unless({
        //@ pass api without validating
        path: unlessRoutes
    }));
通过在unlessRoutes中提供一个数组,可以指定在jwt中间件中不希望跳过的路由

var unlessRoutes = [
    '/',
    /\/login/,
    /\/register/,
    /\/customers/,
    /\/customer$/,
    /\/addCustomer/,
    /\/just/,
    /\/search/,
    /\/dynamic/,
    /\/favicon.ico/
]

MongoDB不是已经将随机令牌作为实体的id吗?如果所有用户id都是从同一台服务器生成的,那么可以通过向每个用户id添加一个单原子递增且持久存储的计数器来保证唯一性,从而保证唯一性。您可以添加
crypto.randomBytes()
以使用户id不可预测,但计数器将保证唯一性。请注意,您必须持久地存储计数器,并且它必须由任何创造ID的服务器使用,这样才能完美地存储计数器。@Zhang我使用postgresql@user1775888-您可以使用时间戳。时间戳可能存在一些问题,例如连续多次调用可能会导致检索相同的时间戳,服务器时钟有时可能会关闭,并且可能是很多数字,而这些数字可能只是几个数字的计数器。但是,它通常也可以工作。为什么不使用像或这样的现有库呢?从统计上看,发生碰撞的可能性几乎是不存在的。非常感谢!我会尝试节点包uuid为什么每次uuid都可以不同而不是重复?包是否在某个地方存储了一些记录?如果我尝试使用其他方法缩短如stackoverflow default username?不,包没有保存任何记录,并且事实上不保证唯一性。但是看看我展示的维基百科链接中给出的概率图。我使用UUIDtype4处理一个跨多个数据库有数百万条记录的数据库。我们从未遇到过重复条目的问题。无论出于何种目的,您都可以将其视为从未发生过。如果您将字符串缩短,例如,将其视为特价代码或汽车登记,则您需要检查重复项。在while循环中生成id,通过尝试读取匹配记录来测试没有相同的id。返回第一个没有匹配记录的代码。如果您有比实际记录更多的可能代码,这是合理有效的/