diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 136a05a7a..bde728e32 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -33,6 +33,24 @@ const issueToken = (payload, appSettings) => { } }; +/** + * Creates and returns a JWT refresh token with an arbitrary payload + * @function + * @param {Object} payload - Here we have passed MongoDB assigned _id. + * @param {Object} appSettings + * @returns {String} + * @throws {Error} + */ +const issueRefreshToken = (payload, appSettings) => { + try { + const tokenTTL = appSettings.refreshTokenTTL ? appSettings.refreshTokenTTL : "7d"; + return jwt.sign({ id: payload }, appSettings.refreshTokenSecret, { expiresIn: tokenTTL }); + } catch (error) { + throw handleError(error, SERVICE_NAME, "issueRefreshToken"); + } +}; + + /** * Registers a new user. If the user is the first account, a JWT secret is created. If not, an invite token is required. * @async @@ -81,6 +99,7 @@ const registerUser = async (req, res, next) => { const appSettings = await req.settingsService.getSettings(); const token = issueToken(userForToken, appSettings); + const refreshToken = issueRefreshToken(userForToken._id, appSettings); req.emailService .buildAndSendEmail( @@ -99,7 +118,7 @@ const registerUser = async (req, res, next) => { return res.status(200).json({ success: true, msg: successMessages.AUTH_CREATE_USER, - data: { user: newUser, token: token }, + data: { user: newUser, token: token, refreshToken: refreshToken }, }); } catch (error) { console.log("ERROR", error); @@ -147,13 +166,14 @@ const loginUser = async (req, res, next) => { // Happy path, return token const appSettings = await req.settingsService.getSettings(); const token = issueToken(userWithoutPassword, appSettings); + const refreshToken = issueRefreshToken(userWithoutPassword._id, appSettings); // reset avatar image userWithoutPassword.avatarImage = user.avatarImage; return res.status(200).json({ success: true, msg: successMessages.AUTH_LOGIN_USER, - data: { user: userWithoutPassword, token: token }, + data: { user: userWithoutPassword, token: token, refreshToken: refreshToken }, }); } catch (error) { next(handleError(error, SERVICE_NAME, "loginController")); diff --git a/Server/service/settingsService.js b/Server/service/settingsService.js index 24e890d64..764c24db3 100644 --- a/Server/service/settingsService.js +++ b/Server/service/settingsService.js @@ -6,11 +6,13 @@ const envConfig = { apiBaseUrl: undefined, clientHost: process.env.CLIENT_HOST, jwtSecret: process.env.JWT_SECRET, + refreshTokenSecret: process.env.REFRESH_TOKEN_SECRET, dbType: process.env.DB_TYPE, dbConnectionString: process.env.DB_CONNECTION_STRING, redisHost: process.env.REDIS_HOST, redisPort: process.env.REDIS_PORT, jwtTTL: process.env.TOKEN_TTL, + refreshTokenTTL: process.env.REFRESH_TOKEN_TTL, pagespeedApiKey: process.env.PAGESPEED_API_KEY, systemEmailHost: process.env.SYSTEM_EMAIL_HOST, systemEmailPort: process.env.SYSTEM_EMAIL_PORT,