,

Implementing User Authentication and Role-Based Authorization using Express, MongoDB, JWT Access Token, and bcrypt in NODE JS

Posted by






Простая авторизация на NODE JS. Роли пользователя. Express и MongoDB. JWT Access Token, bcrypt

Простая авторизация на 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 для хеширования и сравнения паролей.

Применение аутентификации и авторизации является важной частью большинства веб-приложений, и это лишь один из множества способов реализации. Вам следует учитывать особенности вашего проекта и выбрать лучший подход для вашей конкретной ситуации.


0 0 votes
Article Rating
20 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
коля лёвин
1 year ago

Это просто Пушка!!! актуально и в 2023

Дмитрий Дмитриевич
1 year ago

Автор СПАСИБО за урок, НО пожалуйста ПЕРЕСТАНЬ на видео ТАК БЫСТРО ПЕРЕПРЫГИВАТЬ ИЗ ОКНА В ОКНО – невозможно успеть прочитать ничего, постоянно приходиться клацать паузу и ещё попробуй успей паузу нажать!

Redice
1 year ago

ты мой хороший, оставляю комментарий и ставлю лайк

Ivan Post
1 year ago

Спасибо большое! Для продвижения канала))

ROADING
1 year ago

Бог

Вячеслав Олейник
1 year ago

Спасибо

Viktor Sorokin
1 year ago

Тимур, спасибо.
Дело дельное.

Мансур Джалалов
1 year ago

Привет! Не могли бы посоветовать, где узнать (или если не сложно объясните сами) зачем разделение на две сущности. Роль и юзер – это не усложнение? Можно же написать текстом роль в значении? А то думаю создать две таблицы в sql, но ни как не могу понять зачем (Решил повторить тоже самое только без express и на mysql). Или это разница в концепциях sql и nosql баз данных? Заранее спасибо за ответ!

Roger
1 year ago

прекрасный урок. ничего не упущено, все работает. Спасибо!

Artiom Borisov
1 year ago

Комментарий 3

Artiom Borisov
1 year ago

Комментарий 2

Artiom Borisov
1 year ago

Комментарий 1

Dead Inside
1 year ago

Подскажите пожалуйста, а что это за ошибка? Я повторял весь написанный код из видео и вот с момента 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)

Денис
1 year ago

Не понимаю иногда восторженных отзывов пользователей, все пишут ура, в голове все по полочкам, ты лучший, эмм тут галопам по европам… вы хоть задумывались над тем, что тут ничего не объяснено? тут показан процесс интеграции, сама концепция – дело интересное, как и процесс ее реализации, но слишком поверхностно. если после этого видео у вас все в голове разложилось по полочкам, то скорее всего, вы все уже и так знали или же это сила воображения

Дмитрий Шатов
1 year ago

Чел выдал базу за 30 минут абсолютно бесплатно в то время, когда другие продают то же самое за деньги и растягивают на несколько часов а то и дней.

Anton
1 year ago

Хорошо, молодей, актуально и по сей день

Doh
Doh
1 year ago

12:45 разве не должна сработать валидация в mongodb, так как мы указывали, что это поле уникальное?

Александр Кошелев
1 year ago

спасибо за контент!

Serega5j
1 year ago

Я почти все понял, остается разобраться с ролями. Не очень ясен этот механизм. Я прицепил к req.user в котором имеется массив ролей. А дальше..сейчас буду курить эту тему

Elias
1 year ago

Начал смотреть, но чувствую, что прям кайф видосик, налил чаека