Аутентификация пользователя — это процесс проверки личности пользователя, пытающегося получить доступ к вашему приложению. Он включает в себя авторизацию и передачу учетных данных для подтверждения подлинности пользователя.
Вы можете реализовать простую модель аутентификации пользователей в Node.js, используя Express, Bcrypt и MongoDB, всего за несколько шагов.
Шаг 1: Настройка среды разработки
Сначала создайте папку проекта и CD в него, запустив:
mkdir аутентификация пользователя
CD аутентификация пользователя
Затем инициализируйте npm в каталоге вашего проекта, выполнив:
инициализация npm -y
-у флаг инициализирует npm и создает ваш пакет.json файл со всеми настройками по умолчанию.
Для этой модели аутентификации пользователя требуется несколько зависимостей.
Они включают:
- Выражать: Express — это фреймворк Node.js. который обеспечивает надежный набор функций для веб-приложений и мобильных приложений. Это упрощает создание серверных приложений с помощью Node.js.
- Bcrypt: bcrypt — это пакет npm, который реализует функцию хеширования пароля bcrypt. Он позволяет создавать хэши из простых строк паролей.
- 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 файл и использовать его в качестве промежуточного программного обеспечения уровня приложения.
Это завершает вашу модель аутентификации пользователя; теперь пользователи могут безопасно регистрироваться и входить в ваше приложение.
Важность аутентификации пользователя
Аутентификация пользователей гарантирует, что только законные пользователи могут получить доступ к вашему приложению. Если ваши данные каким-либо образом являются личными или частными, вам следует предпринять шаги, чтобы предотвратить доступ к ним неавторизованных пользователей.