узел jwt: как я могу отправить новый токен, когда истекает срок действия старого? - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над игрой, в которой требуется, чтобы пользователь выполнил вход, поэтому я отправляю токен с истечением 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 expired

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...