Аутентификация пользователя — это процесс проверки личности пользователя, пытающегося получить доступ к вашему приложению. Он включает в себя авторизацию и передачу учетных данных для подтверждения подлинности пользователя.

Вы можете реализовать простую модель аутентификации пользователей в Node.js, используя Express, Bcrypt и MongoDB, всего за несколько шагов.

Шаг 1: Настройка среды разработки

Сначала создайте папку проекта и CD в него, запустив:

mkdir аутентификация пользователя
CD аутентификация пользователя

Затем инициализируйте npm в каталоге вашего проекта, выполнив:

инициализация npm -y

флаг инициализирует npm и создает ваш пакет.json файл со всеми настройками по умолчанию.

Для этой модели аутентификации пользователя требуется несколько зависимостей.

Они включают:

  • Выражать: Express — это фреймворк Node.js. который обеспечивает надежный набор функций для веб-приложений и мобильных приложений. Это упрощает создание серверных приложений с помощью Node.js.
  • Bcrypt: bcrypt — это пакет npm, который реализует функцию хеширования пароля bcrypt. Он позволяет создавать хэши из простых строк паролей.
    instagram viewer
  • Mongoose: Mongoose — это библиотека моделирования объектных данных MongoDB. Это упрощает взаимодействие между вашим приложением и базой данных MongoDB.
  • dotenv: dotenv — это пакет с нулевой зависимостью, который загружает переменные среды из .env файл в процесс.env.
  • Валидатор: валидатор — это пакет, содержащий различные функции проверки строк.
  • Body-parser: пакет body-parser анализирует тело запроса в промежуточном программном обеспечении перед вашими обработчиками.

Установите пакеты, запустив:

нпм установить Экспресс-валидатор bcrypt mongoose dotenv тело-парсер

Далее создайте app.js файл в корневом каталоге вашего проекта и добавьте приведенный ниже блок кода, чтобы создать базовый сервер Express:

// app.js
константа экспресс = требовать('выражать');
константа приложение = экспресс();
константа парсер тела = требовать("тело-парсер");

константа порт = 3000;

приложение.использовать(bodyParser.json());
приложение.использовать(bodyParser.urlencoded({ расширенный: истинный }));

app.listen (порт, () =>{
приставка.журнал(`Приложение прослушивает порт ${порт}`);
});

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

Шаг 2. Подключение вашего приложения к базе данных

В корневом каталоге вашего проекта создайте .env файл и сохраните в нем свои учетные данные MongoDB. Это позволяет избежать раскрытия учетных данных вашей базы данных в коде, который может предоставить злоумышленникам доступ к вашей базе данных.

Далее перейдите к своему app.js файл и импортировать мангуст:

константа мангуст = требовать("мангуста");

Затем вызовите импорт дотенв и позвоните конфигурация метод на нем:

требовать("дотенв").конфиг();

Вызов конфигурация метод на дотенв загружает переменные окружения в процесс.env.

Наконец, вызовите метод подключения на мангуста и передайте свой URI MongoDB в качестве аргумента:

mongoose.connect (процесс.env. MONGODB_URI).затем(() => {
console.log('Подключено к базе данных успешно')
})

Шаг 3: Создание пользовательской модели

В корневом каталоге вашего проекта создайте «модели" папка; здесь вы будете хранить свою модель мангуста:

модели mkdir

Далее создайте «модель пользователя» и добавьте следующие импорты:

константа мангуст = требовать('мангуста')
константа {это электронная почта} = требовать(«валидатор»)

isEmail это функция проверки, которая возвращает истинный если данная строка является электронной почтой. Он понадобится вам для применения проверки мангуста к вашей пользовательской модели.

Затем добавьте следующий код в свой модель пользователя файл:

// модели/userModel
константа userSchema = мангуст. Схема({
Эл. адрес: {
тип: Нить,
требуется: [правда, 'Электронная почта обязательна'],
подтвердить: {
валидатор: isEmail,
сообщение: реквизит => `${реквизит.значение} недействительный адрес электронной почты`
}
},

пароль: {
тип: Нить,
требуется: [правда, 'требуется пароль'],
подтвердить: {
валидатор: функция (ценность) {
возвращаться значение.длина >= 6
},
сообщение: () =>'Пароль должен быть не менее шести символов'
}
}
})

модуль.экспорт = mongoose.model('Пользователь', userSchema)

Приведенный выше код создает пользовательская схема переменная, в которой хранится значение мангуста. Схема метод. Мангуст. Метод схемы сопоставляет свойства с коллекцией MongoDB и определяет форму документов в ней. Схема мангуста имеет два свойства: Эл. адрес и пароль— которые будут вашими требованиями к аутентификации.

Свойство электронной почты является строковым типом и имеет требуется установить на истину. Сопутствующее сообщение об ошибке «Требуется электронная почта» будет отображаться, если тело запроса не содержит Эл. адрес имущество. Наконец, используя пользовательскую проверку мангуста, валидатор свойство относится к isEmail функция. Эта функция возвращает true или false в зависимости от того, действительно ли строка является электронным письмом. Затем свойство сообщения принимает значение электронной почты (реквизит) и создает осмысленное сообщение об ошибке.

Свойство пароля является обязательным строковым типом с сообщением об ошибке, которое гласит: «Требуется пароль». валидатор Функция является анонимной и возвращает true, если пароль содержит не менее шести символов.

Последняя строка создает и экспортирует модель мангуста, вызывая метод модель метод на мангуста. Передайте название модели (Пользователь) в качестве первого аргумента и схемы (пользовательская схема) в качестве второго аргумента.

Шаг 4. Реализация маршрутов входа и регистрации

В корневом каталоге вашего проекта создайте маршруты папка:

мкдир маршруты

В папке маршрутов создайте userRoutes.js файл и добавьте следующие импорты:

// маршруты/userRoutes.js
константа экспресс = требовать("выражать");
константа Пользователь = требовать("../модели/модель пользователя");
константа бкрипт = требовать("Бикрипт");

Создайте экземпляр Express Router, вызвав Маршрутизатор метод на выражать:

константа роутер = экспресс. Маршрутизатор();

Затем создайте маршрут регистрации, добавив приведенный ниже блок кода в свой userRoute.js файл:

роутер.пост("/sign-up", асинхронный (требование, разрешение) => {
пытаться {
// Извлечь адрес электронной почты и пароль из объекта req.body
константа {электронная почта, пароль} = req.body;

// Проверятьесли электронная почта является уже виспользовать
позволять пользователь существует = Ждите User.findOne({электронная почта});

если (пользователь существует) {
рез.статус(401).json({сообщение: "Электронная почта уже находится в использовать.&цитата; });
возвращаться;
}

// Определить раунды соли
константа сольРаунды = 10;

// Хэш-пароль
bcrypt.hash (пароль, saltRounds, (ошибка, хэш) => {
если (ошибка) бросатьновыйОшибка("Внутренний сервер Ошибка");

// Создавать а новыйпользователь
позволять пользователь = новый Пользователь({
Эл. адрес,
пароль: хэш,
});

// Сохраняем пользователя в БД
user.save().then(() => {
res.json({сообщение: "Пользователь успешно создан", пользователь });
});
});
} ловить (ошибка) {
возвращатьсяразрешение.статус(401).Отправить(ошибаться.сообщение);
}
});

В приведенном выше блоке кода сначала вы деструктурировали адрес электронной почты и пароль из затреб.тело объект. Затем проверьте, не использует ли уже этот адрес электронной почты пользователь, поскольку он должен быть уникальным для каждого пользователя. Если электронная почта уже использовалась, вы возвращаетесь и останавливаете выполнение кода с кодом состояния 401.

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

Используя bcrypt, вы хешируете ваш пользовательский пароль, вызвав хеш-метод в bcrypt. Метод hash принимает три параметра: строку для хеширования, раунды соли и функцию обратного вызова. Вы передаете пароль пользователя, созданную ранее переменную saltRounds и обратный вызов.

Раунды соли — это время, необходимое для вычисления одного хэша bcrypt. Чем больше раундов соли, тем больше раундов хеширования.

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

Затем создайте маршрут входа, добавив приведенный ниже блок кода в свой userRoute.js файл:

роутер.пост("/sign-in", асинхронный (требование, разрешение) => {
пытаться {
// Извлечь адрес электронной почты и пароль из объекта req.body
константа {электронная почта, пароль} = req.body;

// Проверятьеслипользовательсуществуютвбаза данных
позволять пользователь = Ждите User.findOne({электронная почта});

если (!пользователь) {
вернуть res.status (401).json({сообщение: "Недействительные учетные данные" });
}

// Сравнить пароли
bcrypt.compare (пароль, user.password, (ошибка, результат) => {
если (результат) {
вернуть res.status (200).json({сообщение: "Пользователь успешно вошел в систему" });
}

приставка.log (ошибка);
вернуть res.status (401).json({сообщение: "Недействительные учетные данные" });
});
} ловить (ошибка) {
разрешение.статус(401).Отправить(ошибаться.сообщение);
}
});

модуль.экспорт = маршрутизатор;

В приведенном выше блоке кода сначала вы деструктурируете адрес электронной почты и пароль из затреб.тело объект. Затем вы проверяете, существует ли пользователь в вашей базе данных. Если пользователь не существует в вашей базе данных, вы возвращаетесь с кодом состояния 401.

Затем, используя метод сравнения bcrypt, передайте пароль, предоставленный пользователем, и хешированный пароль, который вы получили из своей базы данных. Сравните два, чтобы убедиться, что они совпадают. Если пароли совпадают, вы возвращаете код состояния 200 и сообщение об успешном завершении. В противном случае вы вернете код состояния 401 и сообщение об ошибке.

Наконец, импорт маршрутизатор в твой app.js файл и использовать его в качестве промежуточного программного обеспечения уровня приложения.

Это завершает вашу модель аутентификации пользователя; теперь пользователи могут безопасно регистрироваться и входить в ваше приложение.

Важность аутентификации пользователя

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