Я новичок в этой части серверной разработки, использующей JS
, и, по правде говоря, это новый язык программирования (для меня), меня беспокоит, что он неожиданно не соответствует стандартам структурирования и / или безопасности.
ЧИСТАЯ АРКИТЕКТУРА
API / CONTROLLERS / SERVICES / LIBS
МАРШРУТ
//Required application
const express = require('express');
//Required services
const LoginServive = require('../../services/auth/login');
// Schemas
const {
authenticationIdSchema,
authenticationSchema
} = require('../../utils/schemas/auth/login');
// Middleware
const verifyToken = require('../../utils/middleware/verifyTokenHandler.js');
const validationHandler = require('../../utils/middleware/validationHandler')
function loginApi(app)
{
const router = express.Router();
app.use("/api/v1/login", router);
//Class call
const loginService = new LoginServive();
/*
******************************************************************************
******************************************************************************
****************************** POST METHOD ******************************
******************************************************************************
******************************************************************************
*/
router.post('/',
validationHandler(authenticationSchema),
async function(req, res, next) {
const { body:login } = req;
try
{
const response = await loginService.login({ login });
const data = response[0];
req.session.user = {
_id:response[1].id,
_username: response[1].username,
_name: response[1].name,
_role: response[1].role
};
console.log("Session: ", req.session.user);
res.status(201).json(data);
} catch (err) {
next(err);
}
});
}
module.exports = loginApi;
ОБСЛУЖИВАНИЕ
const pool = require('../../lib/db');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const { config } = require('../../config');
class LoginService
{
async login({ login })
{
//Parameters
const { username, password } = login;
//Api Info
const SECRET_API = config.secretApi;
if (username && password)
{
const user_query = `SELECT usr.id,
usr.username,
usr.email,
usr.hash,
CONCAT(pple.name, ' ', pple.lastname) AS full_username,
usr.user_status_id,
usr.user_type_id
FROM users usr
INNER JOIN people pple
ON pple.id = usr.people_id
INNER JOIN user_states usts
ON usts.id = usr.user_status_id
INNER JOIN user_types utps
ON utps.id = usr.user_type_id
WHERE usr.data_status_id = '1'
AND usr.email = ?`;
const rows = await pool.query(user_query, [username]);
if (rows.length > 0) {
const { id, username, email, hash, full_username, user_status_id, user_type_id } = rows[0];
// Compare hash with the plain text password
const match = await bcrypt.compare(password, hash);
if (match) {
//Get the access token
const token = jwt.sign({ _id: id }, SECRET_API, {
expiresIn: 60 * 60 * 8
});
const response = [
{
status: 201,
message:'You are welcome.',
role: user_type_id,
token:token
},
{
id:id,
username: username,
name: full_username,
role: user_type_id
}
];
const authenticationId = await Promise.resolve(response);
return authenticationId || [];
} else {
const authenticationId = {
status: 401,
message:'Wrong password.'
};
return authenticationId || [];
}
} else {
const authenticationId = {
status: 401,
message:'The user does not exist.'
};
return authenticationId || [];
}
}
};
};
module.exports = LoginService;
MySQL SESSION STORE
Для хранилища данных сеанса я реализую express - mysql -сессия это отражено в прямой документации express-session
Предупреждение Память хранилища на стороне сервера по умолчанию, MemoryStore, специально не предназначена для производственной среды. В большинстве случаев происходит утечка памяти, она не масштабируется после одного процесса и предназначена для отладки и разработки.
ВОПРОСЫ
Я пытаюсь реализуйте модель разработки Clean Architecture и отложите модель MVC в поисках максимальной производительности в этой части разработки.
- Подвергается ли мой код воздействию какая-то SQL инъекция или другой тип недостатка безопасности?
- Сеанс пользователя является важной проблемой (из-за проблем безопасности и производительности), это хорошая практика для того, что я делаю, так как я ожидал сделать это непосредственно из службы, но у меня были проблемы с доступом к запросу
req
. - Является ли какая-либо часть кода улучшаемой?
- Должны ли я назначить данные сеанса в токене
{ _id: id }
или реализовать express -сессию?