为用户ID生成随机唯一标记

时间:2015-08-09 05:44:11

标签: 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) {
          if (error) {
            reject(error);
          } else {
            var token = buf.toString('hex');
            fulfill(token);
          }
        });
      });
    };

3 个答案:

答案 0 :(得分:3)

来自正确播种的加密库的八个随机字节碰撞的可能性很小,因此您通常不需要关注重复项。实际上,将其增加到16个字节,并且您的代码与UUID version 4相同。这被视为UUID的标准。碰撞的可能性非常小,通常不值得考虑。

如果您走得那么远,请考虑使用标准格式UUID,例如the node package "uuid"。还有数据库端uuid函数,您可以将它们默认添加到模式,例如in Postgres。优势是为您的ID提供标准化且易于理解的格式,您不需要花费任何时间来证明或维护您的代码,只需将开发人员指向标准文档即可。

答案 1 :(得分:2)

如果您希望此令牌用于身份验证,则应使用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/
]

答案 2 :(得分:0)

我认为我们可以使用加密来生成随机令牌:

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

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