Простая авторизация на NODE JS. Роли пользователя. Express и MongoDB. JWT Access Token, bcrypt
В этой статье мы рассмотрим, как реализовать простую авторизацию на NODE JS с использованием Express и MongoDB. Мы также будем использовать JWT Access Token для проверки подлинности пользователя и bcrypt для хеширования и сравнения паролей.
Установка зависимостей
Перед тем, как начать, убедитесь, что у вас установлены Node.js и MongoDB.
Для установки Express, MongoDB и других зависимостей выполните следующую команду в командной строке:
npm install express mongodb bcrypt jsonwebtoken
Настройка базы данных
Для начала, создайте базу данных MongoDB и добавьте коллекцию “users”. Эта коллекция будет содержать информацию о зарегистрированных пользователях.
Для простоты, добавим следующие поля в коллекцию “users”: “name”, “email”, “password” и “role”. “name” – это имя пользователя, “email” – адрес электронной почты, “password” – хеш пароля с помощью bcrypt, а “role” – роль пользователя (например, “admin”, “user” и т. д.).
Настройка сервера
Создайте новый файл server.js и добавьте следующий код:
const express = require('express');
const app = express();
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const MongoClient = require('mongodb').MongoClient;
const PORT = process.env.PORT || 3000;
const MONGO_URL = 'mongodb://localhost:27017/mydb';
app.use(express.json());
MongoClient.connect(MONGO_URL, (err, client) => {
if (err) {
console.error(err);
return;
}
const db = client.db('mydb');
const users = db.collection('users');
// Регистрация пользователя
app.post('/register', (req, res) => {
const { name, email, password, role } = req.body;
// Хеширование пароля
const salt = bcrypt.genSaltSync(10);
const hashedPassword = bcrypt.hashSync(password, salt);
// Сохранение пользователя в базе данных
users.insertOne({ name, email, password: hashedPassword, role }, (err, result) => {
if (err) {
console.error(err);
res.status(500).send('Произошла ошибка при регистрации пользователя');
return;
}
res.status(200).send('Пользователь успешно зарегистрирован');
});
});
// Вход пользователя
app.post('/login', (req, res) => {
const { email, password } = req.body;
// Поиск пользователя по адресу электронной почты
users.findOne({ email }, (err, user) => {
if (err) {
console.error(err);
res.status(500).send('Произошла ошибка при входе пользователя');
return;
}
// Сравнение паролей
const isPasswordValid = bcrypt.compareSync(password, user.password);
if (!isPasswordValid) {
res.status(401).send('Неправильный адрес электронной почты или пароль');
return;
}
// Генерация JWT Access Token
const token = jwt.sign({ email, role: user.role }, 'secret_key');
res.status(200).send({ token });
});
});
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
});
Этот файл настраивает сервер Express, устанавливает соединение с базой данных MongoDB и определяет два маршрута – “/register” для регистрации новых пользователей и “/login” для входа.
Метод “/register” хеширует пароль с помощью bcrypt и сохраняет пользователя в базе данных. Метод “/login” проверяет переданные данные пользователя и сравнивает хешированный пароль с введенным паролем. Если данные верны, сервер генерирует JWT Access Token и отправляет его в ответе.
Важно помнить, что в этом примере секретный ключ “secret_key” для генерации JWT Access Token должен быть заменен на более сложный и безопасный ключ в реальном приложении.
Роли пользователя
Роль пользователя определяется значением поля “role” в базе данных. Вы можете добавить условные операторы в методах “/register” и “/login” для проверки роли пользователя и выполнения соответствующих действий (например, отдельный доступ для администраторов).
Заключение
В этой статье мы рассмотрели, как создать простую авторизацию на NODE JS с использованием Express и MongoDB. Мы также использовали JWT Access Token для проверки подлинности пользователя и bcrypt для хеширования и сравнения паролей.
Применение аутентификации и авторизации является важной частью большинства веб-приложений, и это лишь один из множества способов реализации. Вам следует учитывать особенности вашего проекта и выбрать лучший подход для вашей конкретной ситуации.
Это просто Пушка!!! актуально и в 2023
Автор СПАСИБО за урок, НО пожалуйста ПЕРЕСТАНЬ на видео ТАК БЫСТРО ПЕРЕПРЫГИВАТЬ ИЗ ОКНА В ОКНО – невозможно успеть прочитать ничего, постоянно приходиться клацать паузу и ещё попробуй успей паузу нажать!
ты мой хороший, оставляю комментарий и ставлю лайк
Спасибо большое! Для продвижения канала))
Бог
Спасибо
Тимур, спасибо.
Дело дельное.
Привет! Не могли бы посоветовать, где узнать (или если не сложно объясните сами) зачем разделение на две сущности. Роль и юзер – это не усложнение? Можно же написать текстом роль в значении? А то думаю создать две таблицы в sql, но ни как не могу понять зачем (Решил повторить тоже самое только без express и на mysql). Или это разница в концепциях sql и nosql баз данных? Заранее спасибо за ответ!
прекрасный урок. ничего не упущено, все работает. Спасибо!
Комментарий 3
Комментарий 2
Комментарий 1
Подскажите пожалуйста, а что это за ошибка? Я повторял весь написанный код из видео и вот с момента 11:32, когда делаю проверку через программу Postman появилась эта ошибка(
TypeError: Role is not a constructor
at getUsers (C:UsersADMINDesktopafauthController.js:21:30)
at Layer.handle [as handle_request] (C:UsersADMINDesktopafnode_modulesexpresslibrouterlayer.js:95:5)
at next (C:UsersADMINDesktopafnode_modulesexpresslibrouterroute.js:144:13)
at Route.dispatch (C:UsersADMINDesktopafnode_modulesexpresslibrouterroute.js:114:3)
at Layer.handle [as handle_request] (C:UsersADMINDesktopafnode_modulesexpresslibrouterlayer.js:95:5)
at C:UsersADMINDesktopafnode_modulesexpresslibrouterindex.js:284:15
at Function.process_params (C:UsersADMINDesktopafnode_modulesexpresslibrouterindex.js:346:12)
at next (C:UsersADMINDesktopafnode_modulesexpresslibrouterindex.js:280:10)
at expressInit (C:UsersADMINDesktopafnode_modulesexpresslibmiddlewareinit.js:40:5)
at Layer.handle [as handle_request] (C:UsersADMINDesktopafnode_modulesexpresslibrouterlayer.js:95:5)
Не понимаю иногда восторженных отзывов пользователей, все пишут ура, в голове все по полочкам, ты лучший, эмм тут галопам по европам… вы хоть задумывались над тем, что тут ничего не объяснено? тут показан процесс интеграции, сама концепция – дело интересное, как и процесс ее реализации, но слишком поверхностно. если после этого видео у вас все в голове разложилось по полочкам, то скорее всего, вы все уже и так знали или же это сила воображения
Чел выдал базу за 30 минут абсолютно бесплатно в то время, когда другие продают то же самое за деньги и растягивают на несколько часов а то и дней.
Хорошо, молодей, актуально и по сей день
12:45 разве не должна сработать валидация в mongodb, так как мы указывали, что это поле уникальное?
спасибо за контент!
Я почти все понял, остается разобраться с ролями. Не очень ясен этот механизм. Я прицепил к req.user в котором имеется массив ролей. А дальше..сейчас буду курить эту тему
Начал смотреть, но чувствую, что прям кайф видосик, налил чаека