2023-06-07 08:28:29 +00:00
|
|
|
const UserError = require('vn-loopback/util/user-error');
|
2023-12-04 13:46:05 +00:00
|
|
|
const {models} = require('vn-loopback/server/server');
|
|
|
|
|
2023-12-14 11:04:05 +00:00
|
|
|
const handlePromiseLogout = (Self, {id}, courtesyTime) => {
|
2023-11-04 13:39:26 +00:00
|
|
|
new Promise(res => {
|
|
|
|
setTimeout(() => {
|
|
|
|
res(Self.logout(id));
|
|
|
|
}
|
|
|
|
, courtesyTime * 1000);
|
|
|
|
});
|
|
|
|
};
|
2023-05-24 13:01:59 +00:00
|
|
|
module.exports = Self => {
|
|
|
|
Self.remoteMethodCtx('renewToken', {
|
2023-06-07 08:28:29 +00:00
|
|
|
description: 'Checks if the token has more than renewPeriod seconds to live and if so, renews it',
|
2023-06-21 12:12:42 +00:00
|
|
|
accessType: 'WRITE',
|
2023-05-24 13:01:59 +00:00
|
|
|
accepts: [],
|
2023-05-25 07:51:56 +00:00
|
|
|
returns: {
|
|
|
|
type: 'Object',
|
|
|
|
root: true
|
|
|
|
},
|
2023-05-24 13:01:59 +00:00
|
|
|
http: {
|
|
|
|
path: `/renewToken`,
|
|
|
|
verb: 'POST'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2023-05-24 13:16:04 +00:00
|
|
|
Self.renewToken = async function(ctx) {
|
2023-11-04 15:51:25 +00:00
|
|
|
const {accessToken: token} = ctx.req;
|
2023-05-24 13:01:59 +00:00
|
|
|
|
2023-11-04 13:39:26 +00:00
|
|
|
// Check if current token is valid
|
2023-12-13 12:39:43 +00:00
|
|
|
const isValid = await validateToken(token);
|
2023-12-14 11:21:07 +00:00
|
|
|
if (isValid)
|
|
|
|
return token;
|
2023-11-04 15:51:25 +00:00
|
|
|
|
2023-12-12 18:43:32 +00:00
|
|
|
const {courtesyTime} = await models.AccessTokenConfig.findOne({fields: ['courtesyTime']});
|
2023-06-07 08:28:29 +00:00
|
|
|
|
2023-11-04 13:39:26 +00:00
|
|
|
// Schedule to remove current token
|
|
|
|
handlePromiseLogout(Self, token, courtesyTime);
|
2023-05-24 13:01:59 +00:00
|
|
|
|
2023-11-04 13:39:26 +00:00
|
|
|
// Create new accessToken
|
2023-06-29 10:11:16 +00:00
|
|
|
const user = await Self.findById(token.userId);
|
2023-05-25 08:09:38 +00:00
|
|
|
const accessToken = await user.createAccessToken();
|
2023-05-24 13:01:59 +00:00
|
|
|
|
2023-06-29 10:11:16 +00:00
|
|
|
return {id: accessToken.id, ttl: accessToken.ttl};
|
2023-05-24 13:01:59 +00:00
|
|
|
};
|
2023-12-13 12:39:43 +00:00
|
|
|
|
|
|
|
async function validateToken(token) {
|
|
|
|
const accessTokenConfig = await models.AccessTokenConfig.findOne({fields: ['renewPeriod', 'courtesyTime']});
|
|
|
|
const now = Date.now();
|
|
|
|
const differenceMilliseconds = now - token.created;
|
|
|
|
const differenceSeconds = Math.floor(differenceMilliseconds / 1000);
|
|
|
|
const isValid = differenceSeconds < accessTokenConfig.renewPeriod - accessTokenConfig.courtesyTime;
|
|
|
|
|
|
|
|
return isValid;
|
|
|
|
}
|
2023-05-24 13:01:59 +00:00
|
|
|
};
|