节点jwt:旧令牌到期后,如何发送新令牌?

时间:2018-11-14 11:14:59

标签: node.js promise jwt

我正在开发一个要求用户登录的游戏,所以我发送的令牌到期时间为24小时,因此用户不必登录。

我对令牌的理解(可能是处理)是粗略的,但是到目前为止,它已经达到了我需要的功能(允许用户通过提交令牌自动登录,如果没有有效的访问权限,则无法访问大多数API令牌,并强制用户在24小时后登录。

但是,我遇到一个问题,在玩游戏并提交分数时,令牌已过期,因此无法更新分数。

所以我想为什么不发行新的呢?也许API可以使用过期的令牌并发行新的令牌?好吧,我尝试过。

到目前为止,这是我的代码:

signToken: function(p_userId, p_isRefresh) {
    return new Promise((resolve, reject) => {
        const tokenUuid = uuidv4();
        const connection = dbConnMysql.createConnection();
        dbConnMysql.startConnection(connection).then(() => {
            // Adds user ID, UUID, and expiry to DB
        }).then(() => {
            return dbConnMysql.closeConnection(connection).then(() => {
                const payload = {
                    'id':p_userId,
                    'uuid':tokenUuid
                };
                let token = jwt.sign(payload, appcfg['tkSecret'], {expiresIn: 120}); //86400 for 24 hrs
                var response = {};
                if (!p_isRefresh || p_isRefresh === null) {
                    response = {'token':token};
                } else if (p_isRefresh) {
                    let tokenStatus = {'isValid':true, 'reason':"Token Valid", 'id':p_userId, 'uuid':tokenUuid, 'token':token};
                    var response = {'statusCode': 200, 'message': JSON.stringify(tokenStatus)};
                }
                resolve(response);
            });
        }).catch((error) => {
            // Error Handling
        });

    });
},

validateToken: function(p_token, p_isActive) {
    return new Promise((resolve, reject) => {
        let decodedToken = jwt.verify(p_token, appcfg['tkSecret']);
        let dateNow = new Date();
        if (decodedToken.exp > dateNow.getTime() / 1000) {
            const connection = dbConnMysql.createConnection();
            dbConnMysql.startConnection(connection).then(() => {
                // Checks if UUID is in DB
            }).then((fulfilled) => {
                return dbConnMysql.closeConnection(connection)
                .then(() => {
                    // If UUID is in DB, resolve with token, else, reject with message 'Token not valid'
                })
                .catch((error) => {
                    // Error Handling
                });

            })
        } else {
            if (!p_isActive) {
                // Token was not in use when it became invalid, reject. Deletes entry in DB.
            } else {
                // Token was in use when it became invalid, create a new one.
                dbConnMysql.startConnection(connection).then(() => {
                    // Delete expired token
                }).then(() => {
                    return this.signToken(decodedToken.id, true);                    
                });
            }

        }
    });
}

我的问题是,它甚至不会打扰检查数据库。一次代码行

let decodedToken = jwt.verify(p_token, appcfg['tkSecret']);

被击中,将引发错误,表示令牌已过期,貌似 *使我的其余代码无用。我想知道解决这个问题最简单的方法是什么?尽管我想深入研究并阅读和研究(例如发送刷新令牌)所需的解决方案,但时间紧迫,游戏本身相当僵化,到目前为止很难更改。

我可以想到的一种可能的解决方案是,可以在旧的X时/分/秒之前发行一个新的令牌,而不是在旧的令牌过期时发行新的令牌,但是(可能)具有自己的问题,所以我愿意听听其他想法。

或者...为什么令牌过期后它会完全破坏代码?

*我控制台注销了每个捕获,然后将其阻止,但是据我所知,这是最外层的捕获此错误的原因:

  

TokenExpiredError:jwt已过期

谢谢。

0 个答案:

没有答案