【问题标题】:token generator in node and expressnode 和 express 中的令牌生成器
【发布时间】:2016-10-23 20:52:42
【问题描述】:

我尝试创建一个函数来生成一个随机令牌,该令牌在我的数据库 (Mongodb) 中不存在,并且我在我的用户架构中使用了一个唯一属性。这是我的功能:

 var UniqueTokenGenerator = function () {

        var token = uuid.v4();
        UserModel.findOne({token : token} , (err , user)=> {

            if(err)
                res.status(500).send(err);
            else if(user){
                //1
            }else if(!user){
                 return token; //2
            }

        });

    };

我的问题:

  1. 如果令牌存在,我想调用 UniqueTokenGenerator 或任何...类似循环。
  2. 令牌无法退回。
  3. 有人有更好的主意吗?

我不想使用像 jwt 这样的任何库。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    两个答案:

    首先,您无需检查数据库以确保您的 UUID 是唯一的。 UUID 是如此之大,以至于在数学上您不会遇到冲突。见Are GUID collisions possible?

    其次,要做你想做的事,你需要让你的函数异步并通过回调传递结果。例如

    var generateUniqueToken = (callback) => {
        var token = uuid.v4();
        UserModel.findOne({ token: token }, (err, user) => {
            if(err) {
                // First parameter of the callback is an error.
                callback(err);
            } else if (user) {
                // Try again.
                generateUniqueToken(callback);
            } else if (!user) {
                // First parameter of the callback is an error. The second
                // parameter is the successful result.
                callback(null, token);
            }
        });
    };
    
    // Example usage:
    generateUniqueToken((err, token) => {
        if (err) {
            res.status(500).send(err);
        } else {
            // Use the token here.
        }
    });
    

    【讨论】:

    • tnx 为您解答...但如果 2 个令牌相等则为 1%...?!
    • 是的,如果您生成 2.6 个 quintillion 代币,则有 1% 的机会。地球上只有 75 亿人。
    • 从一个小角度来说,如果你为地球上的每个人创建了一个 UUID,你发现碰撞的几率大约是 0.0000000000000000000>0000001。在接下来的一年里,你被流星击中两次的可能性比你发现碰撞的可能性更大。
    猜你喜欢
    • 2020-04-19
    • 2012-02-01
    • 1970-01-01
    • 2016-02-24
    • 2021-06-24
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多