производительность и безопасность входа в систему для NodeJS с использованием Express с Express -сессионами? - PullRequest
0 голосов
/ 24 апреля 2020

Я новичок в этой части серверной разработки, использующей 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 в поисках максимальной производительности в этой части разработки.

  1. Подвергается ли мой код воздействию какая-то SQL инъекция или другой тип недостатка безопасности?
  2. Сеанс пользователя является важной проблемой (из-за проблем безопасности и производительности), это хорошая практика для того, что я делаю, так как я ожидал сделать это непосредственно из службы, но у меня были проблемы с доступом к запросу req.
  3. Является ли какая-либо часть кода улучшаемой?
  4. Должны ли я назначить данные сеанса в токене { _id: id } или реализовать express -сессию?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...