我想生成令牌作为用户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);
}
});
});
};
答案 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');
};