added refresh token for modulized authorization

This commit is contained in:
Pau 2025-04-06 18:20:47 +02:00
parent b0044ad9b6
commit a288c25561
3 changed files with 75 additions and 9 deletions

View File

@ -0,0 +1,52 @@
import { getUserListModel } from "../../models/authorization/userModel.js"
import { sendResponseUnauthorized } from "../../utils/responses.js"
import { noResults } from "../../validators/result-validators.js"
import mysql from "../../adapters/mysql.js"
import { error401, errorHandler } from "../../utils/errors.js"
import { generateTokens } from "../../services/authService.js"
import dotenv from "dotenv"
dotenv.config();
const postRefreshTokenController = (req, res, next, config) => {
const conn = mysql.start(config)
const { user } = req.auth
getUserListModel({ uuid: user })
.then((response) => {
if (noResults(response)) {
const err = error401()
const error = errorHandler(err, config.environment)
return sendResponseUnauthorized(res, error)
}
// only include uuid and username in the response
const user = response.map(({ id, password, createdBy, deleted, deletedBy, ...rest }) => rest)
return getUserListModel({ uuid: user.uuid, conn })
.then((response) => {
if (noResults(response)) {
const err = error401()
const error = errorHandler(err, config.environment)
return sendResponseUnauthorized(res, error)
}
const tokenPayload = {
uuid: response[0].uuid,
role: response[0].role
}
const {token, refreshToken} = generateTokens(tokenPayload)
//token application in frontend
next({token, refreshToken})
})
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
export { postRefreshTokenController }

View File

@ -1,10 +1,9 @@
import { sendResponseAccessDenied } from '../utils/responses.js';
import { checkPermission, getDataFromToken, generateAccessToken} from '../services/authService.js';
import { sendResponseAccessDenied, sendResponseUnauthorized, sendResponseNotFound } from '../utils/responses.js';
import { checkPermission, getDataFromToken, generateTokens} from '../services/authService.js';
import { getRolesHasPermissionsModel } from '../models/authorization/roles_has_permissionsModel.js';
import { error404, errorHandler } from '../utils/errors.js';
import { noResults } from '../validators/result-validators.js';
import mysql from '../adapters/mysql.js';
import { sendResponseNotFound } from '../utils/responses.js';
const obtainToken = (req, res) => {
return new Promise((resolve, reject) => {
@ -12,7 +11,7 @@ const obtainToken = (req, res) => {
if (token) {
resolve(token);
} else {
return sendResponseAccessDenied(res, { message: 'No authorization provided. Access token required' })
return sendResponseUnauthorized(res, { message: 'No authorization provided. Access token required' })
}
});
};
@ -20,8 +19,8 @@ const obtainToken = (req, res) => {
const setToken = (result, req, res, next, config) => {
const { uuid, role } = result._data
const payload = {role, user: uuid}
const token = generateAccessToken(payload)
next({ user: { ...result, token } })
const {accessToken, refreshToken} = generateTokens(payload)
next({ user: { ...result, accessToken, refreshToken} })
}
const authenticateToken = (req, res, next) => {
@ -32,7 +31,7 @@ const authenticateToken = (req, res, next) => {
next();
})
.catch((error) => {
return sendResponseAccessDenied(res, error);
return sendResponseUnauthorized(res, error);
});
};

View File

@ -28,11 +28,26 @@ const getDataFromToken = (token) => {
* @returns {string} - The generated JWT token.
*/
const generateAccessToken = (payload) => {
const contents = { ...payload, type: 'access' };
const JWT_SECRET = process.env.JWT_SECRET;
const JWT_TIME = parseInt(process.env.JWT_TIME, 10);
return jwt.sign(payload, JWT_SECRET, JWT_TIME ? { expiresIn: JWT_TIME } : {});
return jwt.sign(contents, JWT_SECRET, JWT_TIME ? { expiresIn: JWT_TIME } : {});
};
const generateRefreshToken = (payload) => {
const contents = { ...payload, type: 'refresh' };
const JWT_SECRET = process.env.JWT_SECRET
const JWT_TIME = parseInt(process.env.JWT_REFRESH_TIME, 10);
return jwt.sign(contents, JWT_SECRET, JWT_TIME ? { expiresIn: JWT_TIME } : {});
}
const generateTokens = (payload) => {
const accessToken = generateAccessToken(payload);
const refreshToken = generateRefreshToken(payload);
return { accessToken, refreshToken };
}
/**
* Checks if a user has permission to perform an action on a resource.
* @param {string} userId - The ID of the user.
@ -82,6 +97,6 @@ const _getEndpointByRoute = (route, config) => {
export {
getDataFromToken,
generateAccessToken,
generateTokens,
checkPermission,
};