Мое решение работает, но я не уверен, что это безопасно и уместно. На внешнем интерфейсе у меня есть приложение ReactJS, которое отправляет вместе с axios запрос с логином и паролем. На заднем плане у меня есть NodeJS + ExpressJS, обрабатывающий запрос следующим образом:
router.post('/', function(req, res, next) {
// get the records that match the login provided
const sql = "SELECT name, surname, login, password, blocked FROM users WHERE login=?";
query(sql, [req.body.login])
.then((result)=> {
// if there are 1 or more results, compare the passwords with bcrypt
if (result.length > 0) {
bcrypt.compare(req.body.password, result[0].password, function(err, success) {
if (success) {
// if the user is not blocked, send the status 200 with user's data
result[0].blocked ?
res.status(401).json({type: 'Warning', message: 'Your account has been blocked. Plase contact the admins.'})
:
res.status(200).json({name: result[0].name, surname: result[0].surname, email: result[0].email});
} else {
// send an error if the password is wrong
res.status(401).json({type: 'Error', message: 'Please check that your login and password are correct.'});
}
});
} else {
// send an error if the login was not found
res.status(401).json({type: 'Error', message: 'Please check that your login and password are correct.'});
}
});
});
Достаточно ли / безопасно ли запрашивать базу данных для предоставленного логина (он уникален) с помощью if (result.length > 0)
?
Можно ли, чтобы в ответе сервера содержалось сообщение об ошибке, подобное этому?
res.status(401).json({type: 'Warning', message: 'Your account has been blocked. Plase contact the admins.'})
У меня есть возможность сообщить пользователю, что он ввел правильный логин, но неверный пароль;я должен дать ему знать это? Я думаю, что это дало бы злоумышленникам знание о том, что логин действительно существует, поэтому сейчас я просто отправляю общую ошибку login / pwd. Это нормально?
Можно ли отправлять данные пользователя с сервера клиенту, если вход был успешным?