我正在开发一个要求用户登录的游戏,所以我发送的令牌到期时间为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已过期
谢谢。