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