Как сделать аутентификацию с реакцией и node.js express - PullRequest
0 голосов
/ 18 июня 2020

Я сделал красивую форму входа в систему, используя реакцию, теперь я хочу настроить ее с помощью своей серверной части, и я попытался написать некоторый api для аутентификации входа пользователей. Я знаю, что это неправильный путь. Может кто-нибудь поправить мою Node.js сторону, как заставить ее работать? Реагировать на вход:

 function postLogin() {
axios
  .get(prefix + '/api/login/', {
    params: { username: userName, password: password },
  })
  .then((result) => {
    if (result.status === 200) {
      setAuthTokens(result.data);
      setLoggedIn(true);
    } else {
      setIsError(true);
    }
  })
  .catch((e) => {
    setIsError(true);
  });

}

Node.js роутер:

router.get('/api/login/', async function (req, res, next) {
  console.log(req.query.username);
  console.log(req.query.password);
  // res.sendStatus(200);
  db.checkAuth(req.query.username, req.query.password)
      .then((result) => res.sendStatus(200))
      .catch((error) => res.sendStatus(403)); // Corrected line
});

Node.js Функция DB:

 exports.checkAuth = (username, password) => {
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT * FROM users WHERE username= $1 AND password = $2",
      [username, password],
      (err, result, fields) => {
        if (err) reject(err);
        if(bcrypt.compareSync(password, result.password)){
          console.log("password matched");
          resolve(result);
        }
      }
    );
  });
};

DB:

enter image description here

И когда я записываю свои данные для входа и пытаюсь войти в мой pm2 monit enter image description here

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Одна вещь, которую вы обязательно должны сделать, это не sh пароль во внешнем интерфейсе, а скорее во внутреннем интерфейсе. Таким образом, вы не будете уязвимы для атаки pass-the-ha sh.

Также настройте HTTPS и отправьте свое имя пользователя и пароль в теле HTTP (не в качестве параметра URL). В бэкэнде вы можете просто запросить хешированный пароль для данного имени пользователя и сравнить его с паролем, отправленным из Frontend. Если вы используете bcrypt (на основе предоставленного вами снимка экрана), это может выглядеть примерно так:

con.query(`SELECT password FROM users WHERE username='${username}'`, (result) => {
    if(bcrypt.compareSync(password, result.data[0]["password"])){
        // Password correct, return sessionId as response to frontend
    }
})

Затем вы можете создать sessionId, который вы возвращаете, когда он успешно вошел в систему. (Есть много способов, как вы может выполнять аутентификацию. Это простое базовое решение)

Этот идентификатор сеанса хранится в файлах cookie и отправляется на сервер (в заголовках HTTP) с каждым запросом на сервер.

Надеюсь, это поможет!

1 голос
/ 18 июня 2020

Вы должны правильно отловить ошибку метода checkAuth и отправить соответствующий ответ

router.get('/api/login/:username/:password', async function (req, res, next) {
    db.checkAuth(req.params.username, req.params.password)
        .then((result) => res.sendStatus(200))
        .catch((error) => res.sendStatus(403)); // Corrected line
});

UPD

Также способ составления вашего запроса уязвим для SQL Инъекции . Чтобы этого избежать, используйте параметризованный запрос .

exports.checkAuth = (username, password) => {
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT * FROM users WHERE username = $1 AND password = $2",
      [username, password],
      (err, result, fields) => {
        if (err) reject(err);
        resolve(result);
      }
    );
  });
};
0 голосов
/ 19 июня 2020

Отредактировал функцию запроса к базе данных, подобную этой, и она решила проблему.

exports.checkAuth = (username, password) => {
  console.log('username: ' + username + ' and password: ' + password);
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT password FROM users WHERE username= ?",
      [username],
      (err, result, fields) => {
        if (err) reject(err);
        if (bcrypt.compareSync(password, result[0]['password'])) {
          console.log('password matched');
          resolve(result);
        }
      }
    );
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...