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

В этом руководстве вы узнаете, как реализовать аутентификацию в Node с помощью Passport и MongoDB.

Что такое аутентификация и авторизация?

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

Что такое Passport.js?

Паспорт.js (или Passport) — это промежуточное ПО аутентификации для NodeJS, которое предоставляет более 500 стратегий аутентификации пользователей, включая

instagram viewer
паспорт-местный который использует имя пользователя и пароль.

В этом учебнике используется паспорт-местный а также паспорт-jwt для обеспечения безопасности маршрутов.

Как настроить аутентификацию пользователя в NodeJS

Теперь, когда вы немного знаете об аутентификации пользователей и Passport.js, мы можем посмотреть, как настроить аутентификацию на NodeJS. Ниже мы описали шаги, которые вам необходимо предпринять.

Шаг 1. Настройте сервер Node.js

Создайте папку с именем user-auth-nodejs и перейдите к нему с помощью терминала.

mkdir user-auth-nodejs. 

cd user-auth-nodejs

Следующая инициализация пакет.json.

инициализация нпм

Поскольку вы будете использовать выражать, серверную платформу NodeJS, установите ее, выполнив следующую команду.

нпм я выражаю

Теперь создайте файл, app.jsи добавьте следующий код для создания сервера.

константный экспресс = требуется ("экспресс");
константное приложение = экспресс();
постоянный ПОРТ = 3000;
app.listen (ПОРТ, () => {
console.log(`Прослушивание порта ${PORT}`);
});

Связанный: Узнайте, как установить Npm и Node.js в Ubuntu

Шаг 2: Настройте базу данных

Вам нужна база данных для хранения пользовательских данных. Вы будете использовать mongoose для создания схемы данных MongoDB, которая определяет структуру и тип данных, которые вы будете хранить в базе данных. Поскольку вы храните пользовательские данные, создайте пользовательскую схему.

Установите мангуст.

нпм я мангуст

Создайте новый файл, userModel.jsи добавьте следующее.

const мангуст = требуется ('мангуст')
const {Схема} = мангуст
const UserSchema = новая схема ({
Эл. адрес: {
тип: Строка,
требуется: правда
},
пароль: {
тип: Строка,
требуется: правда
}
})
const UserModel = mongoose.model('пользователь', UserSchema);
модуль.экспорт = Модель пользователя;

Связанный: Как создать базу данных и коллекцию в MongoDB

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

Установить bcryptjs.

npm и bcryptjs

Изменить usermodel.js для шифрования пароля перед его сохранением в базе данных.

const мангуст = требуется ('мангуст')
const bcrypt = require('bcryptjs');
const {Схема} = мангуст

const UserSchema = новая схема ({
...
})
UserSchema.pre('сохранить', асинхронная функция (далее) {
пытаться {
// проверка метода регистрации
постоянный пользователь = это;
если (!user.isModified('пароль')) next();
// генерируем соль
константная соль = ожидание bcrypt.genSalt (10);
// хешируем пароль
const hashedPassword = await bcrypt.hash(this.password, salt);
// заменить простой текстовый пароль на хешированный пароль
this.password = hashedPassword;
следующий();
} поймать (ошибка) {
вернуться дальше (ошибка);
}
});
...
const User = mongoose.model('Пользователь', UserSchema);

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

Использовать isModified чтобы проверить, меняется ли пароль, поскольку вам нужно только хэшировать новые пароли. Затем сгенерируйте соль и передайте ее с паролем в виде простого текста хеш-методу, чтобы сгенерировать хешированный пароль. Наконец, замените простой текстовый пароль хешированным паролем в базе данных.

Создайте db.js и настройте базу данных.

const мангуст = требуют ("мангуст");
мангуста. Обещание = глобальное. Обещать;
const dbUrl = "mongodb://localhost/пользователь";
константное соединение = асинхронное () => {
mongoose.connect(dbUrl, {useNewUrlParser: true, useUnifiedTopology: true});
const db = mongoose.connection;
db.on("ошибка", () => {
console.log("Не удалось подключиться");
});
db.once("открыть", () => {
console.log(">Успешное подключение к базе данных");
});
};
module.exports = {подключиться};

В app.js подключитесь к базе данных.

// подключаемся к БД
const db = требуется ('./db');
БД.подключить();

Шаг 3: Настройте паспорт

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

нпм я паспорт
npm я паспорт-местный

Создайте новый файл, паспортConfig.jsи импорт паспорт-местный и userModel.js.

const LocalStraregy = require("local-паспорт").Strategy;
const User = require("./userModel");

Настройте Passport для обработки регистрации пользователей.

const LocalStrategy = require("local-паспорт");
const User = require("./userModel");
module.exports = (паспорт) => {
паспорт.использовать(
"местная регистрация",
новая локальная стратегия (
{
поле имени пользователя: "электронная почта",
поле пароля: "пароль",
},
async (электронная почта, пароль, готово) => {
пытаться {
// проверяем, существует ли пользователь
const userExists = await User.findOne({ "email": электронная почта });
если (пользователь существует) {
return done (null, false)
}
// Создаем нового пользователя с предоставленными пользовательскими данными
const user = await User.create({электронная почта, пароль});
return done (ноль, пользователь);
} поймать (ошибка) {
сделано (ошибка);
}
}
)
);
}

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

Использовать паспорт-местный также обрабатывать вход пользователя.

module.exports = (паспорт) => {
паспорт.использовать(
"местная регистрация",
новая локальная стратегия(
...
)
);
паспорт.использовать(
"локальный логин",
новая локальная стратегия (
{
поле имени пользователя: "электронная почта",
поле пароля: "пароль",
},
async (электронная почта, пароль, готово) => {
пытаться {
const user = await User.findOne({ электронная почта: электронная почта });
if (!user) return done (null, false);
const isMatch = await user.matchPassword (пароль);
если (!isMatch)
return done (null, false);
// если пароли совпадают возвращаем пользователя
return done (ноль, пользователь);
} поймать (ошибка) {
console.log (ошибка)
вернуть выполненное (ошибка, ложь);
}
}
)
);
};

Здесь проверьте, существует ли пользователь в базе данных, и если существует, проверьте, соответствует ли предоставленный пароль паролю в базе данных. Обратите внимание, что вы также называете матчпароль() метод на пользовательской модели, поэтому перейдите к userModel.js файл и добавьте его.

UserSchema.methods.matchPassword = асинхронная функция (пароль) {
пытаться {
return await bcrypt.compare(пароль, this.password);
} поймать (ошибка) {
выбросить новую ошибку (ошибку);
}
};

Этот метод сравнивает пароль пользователя и пароль в базе данных и возвращает true, если они совпадают.

Шаг 4. Настройте маршруты аутентификации

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

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

приложение.пост(
 "/авторизация/регистрация",
паспорт.аутентификация('локальная регистрация', {сеанс: ложь}),
(запрос, разрешение, следующий) => {
// зарегистрироваться
res.json({
пользователь: req.user,
});
}
);

Связанный: Аутентификация по сравнению с Авторизация: в чем разница?

В случае успеха маршрут регистрации должен вернуть созданного пользователя.

Затем создайте маршрут входа.

приложение.пост(
"/авторизация/логин",
паспорт.аутентификация('локальный-логин', {сеанс: ложь}),
(запрос, разрешение, следующий) => {
// авторизоваться
res.json({
пользователь: req.user,
});
}
);

Шаг 5: Добавьте защищенные маршруты

До сих пор вы использовали Заграничный пасспорт для создания промежуточного программного обеспечения, которое регистрирует пользователя в базе данных, и другого, которое позволяет зарегистрированному пользователю войти в систему. Далее вы создадите промежуточное ПО авторизации для защиты конфиденциальных маршрутов с помощью веб-токена JSON (JWT). Для реализации авторизации JWT необходимо:

  • Создайте токен JWT.
  • Передайте токен пользователю. Пользователь отправит его обратно в запросах на авторизацию.
  • Проверьте токен, отправленный обратно пользователем.

Вы будете использовать jsonwebтокен пакет для обработки JWT.

Выполните следующую команду, чтобы установить его.

npm и jsonwebtoken

Затем сгенерируйте токен для каждого пользователя, успешно вошедшего в систему.

В app.js, импорт jsonwebтокен и измените маршрут входа, как показано ниже.

приложение.пост(
"/авторизация/логин",
паспорт.аутентификация('локальный-логин', {сеанс: ложь}),
(запрос, разрешение, следующий) => {
// авторизоваться
jwt.sign({пользователь: req.user}, 'secretKey', {expiresIn: '1h'}, (ошибка, токен) => {
если (ошибка) {
вернуть res.json ({
сообщение: "Не удалось войти",
токен: ноль,
});
}
res.json({
жетон
});
})
}
);

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

Маршрут входа возвращает токен в случае успеха.

Использовать паспорт-jwt для доступа к защищенным маршрутам.

npm я паспорт-jwt

В паспортConfig.js, настроить паспорт-jwt.

const JwtStrategy = require("passport-jwt").Strategy;
const { ExtractJwt } = требуется ("паспорт-jwt")
module.exports = (паспорт) => {
паспорт.использовать(
"локальный логин",
новая локальная стратегия (
...
);
паспорт.использовать(
новая JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("авторизация"),
секретОрКей: "секретный ключ",
},
асинхронный (jwtPayload, готово) => {
пытаться {
// Извлечь пользователя
постоянный пользователь = jwtPayload.user;
сделано (нуль, пользователь);
} поймать (ошибка) {
сделано (ошибка, ложь);
}
}
)
);
};

Обратите внимание, что вы извлекаете JWT из заголовка авторизации, а не из тела запроса. Это не позволяет хакерам перехватить запрос и получить токен.

Чтобы увидеть, как паспорт-jwt охраняет маршруты, создает защищенный маршрут в приложение.js.

приложение.получить(
"/пользователь/защищено",
паспорт.аутентификация("jwt", {сеанс: ложь}),
(запрос, разрешение, следующий) => {
res.json({пользователь: req.user});
}
);

Только запрос с действительным JWT возвращает пользовательские данные.

Теперь вы готовы поднять аутентификацию пользователя на новый уровень

В этом руководстве вы узнали, как можно аутентифицировать пользователей с помощью электронной почты и пароля с помощью Passport. Сначала это может показаться сложным, но процесс относительно прост. Вы можете пойти еще дальше и использовать сторонних поставщиков удостоверений, поддерживаемых Passport, таких как Twitter, Facebook и Google.

Что такое аутентификация пользователя и как она работает?

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

Читать далее

ДелитьсяТвитнутьЭл. адрес
Похожие темы
  • Программирование
  • Программирование
  • Языки программирования
  • Инструменты программирования
Об авторе
Мэри Гатони (опубликовано 8 статей)

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

Еще от Мэри Гатони

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться