Как разработчик, вы несете ответственность за защиту данных ваших пользователей с помощью аутентификации. Вы можете использовать Passport.js для аутентификации пользователей в приложениях Node и Postgres.
Начните с создания сервера Node с конечными точками для регистрации, входа и выхода пользователей. Вы можете позволить Passport выполнять аутентификацию, чтобы ограничить несанкционированный доступ к вашему приложению.
Создание таблицы пользователей
Для аутентификации пользователя вы будете использовать адрес электронной почты и пароль. Это означает, что таблица пользователей должна содержать поле электронной почты и пароль. В командной строке psql создайте новую базу данных с именем nodeapp:
СОЗДАЙТЕБАЗА ДАННЫХ приложение узла;
Затем создайте таблицу для хранения пользователей:
СОЗДАЙТЕСТОЛпользователи (
id INT ВСЕГДА СОЗДАЕТСЯ КАК ПЕРВИЧНЫЙ КЛЮЧ ИДЕНТИФИКАЦИИ,
электронная почта CHAR(128),
пароль СИМВОЛ(60)
);
Этот код создаст новую таблицу, содержащую адрес электронной почты, пароль и автоматически сгенерированное поле идентификатора.
Создание узлового сервера
Node.js — это серверная среда выполнения JavaScript, которая позволяет нам быстро создавать HTTP-серверы. Чтобы упростить процесс создания сервера и различных HTTP-маршрутов, вы можете использовать Express, веб-фреймворк Node.js.
Запустите эту команду, чтобы создать новую папку с именем postgres-auth:
mkdir postgres-auth
Далее инициализируем npm:
инициализация npm -y
Наконец, установите Express:
экспресс-установка npm
Ты можешь сейчас создать веб-сервер Node.
В новом файле под названием index.js, добавьте следующее:
константа экспресс = требовать("выражать");
константа приложение = экспресс();
app.use(express.json());
app.use (express.urlencoded({ расширенный: истинный }));
приложение.слушай(3000, () => приставка.log("Прослушивание порта 3000"));
Запуск этого кода запустит сервер и выведет в консоль следующее:
Прослушивание порта 3000
Подключение к PostgreSQL.
К подключиться к PostgreSQL использовать узел-postgres. node-postgres — это драйвер соединения, обеспечивающий интерфейс между Node и Postgres.
Выполните следующее, чтобы установить node-postrges через npm:
нпм установить пг
После того, как вы установили эту библиотеку, создайте новый файл с именем db.js и подключить его к базе данных:
константа {Клиент} = требовать("пг");
константа {пользователь, хост, база данных, пароль, порт} = требовать(""./dbConfig");константа клиент = новый Клиент({
пользователь,
хозяин,
база данных,
пароль,
порт,
});
клиент.подключить();
модуль.экспорт = клиент;
Клиентский метод из node-postgres получает информацию о базе данных, к которой вы подключаетесь. Эта программа импортирует информацию о своем соединении из файла с именем БДКонфигурация. Поэтому создайте этот файл и добавьте в него следующий код:
модуль.экспорт = {
пользователь: "постгрес",
хост: "локальный",
база данных: "nodeapp",
пароль: "ВашПароль",
порт: 5432,
};
Создание вспомогательных функций базы данных
Всегда полезно использовать отдельные функции для взаимодействия с базой данных. Они упрощают написание модульных тестов и повышают возможность повторного использования. Для конечной точки регистрации вам необходимо создать две функции:
- Чтобы проверить, зарегистрирована ли электронная почта.
- Создать пользователя.
Цель состоит в том, чтобы зарегистрировать пользователя только в том случае, если он не существует в базе данных.
Создайте новый файл с именем helper.js и импортируйте клиент базы данных из db.js:
константа клиент = требовать("./db.js")
Затем добавьте новую функцию с именем emailExists():
константа электронная почта существует = асинхронный (электронная почта) => {
константа данные = Ждите client.query("SELECT * FROM users WHERE email=$1", [
Эл. адрес,
]);
если (данные.rowCount == 0) возвращатьсяЛОЖЬ;
возвращаться данные.строки[0];
};
Эта функция принимает электронное письмо и проверяет, не используется ли оно уже. Для этого используется предложение SELECT, которое возвращает строку с полем электронной почты, совпадающим со значением, предоставленным регистрирующимся пользователем. Если адрес электронной почты не существует, он возвращает false.
Чтобы создать функцию, создающую пользователя, добавьте функцию createUser() в helper.js:
константа создать пользователя = асинхронный (электронная почта, пароль) => {
константа соль = Ждите bcrypt.genSalt(10);
константа хэш = Ждите bcrypt.hash (пароль, соль);константа данные = Ждите клиент.запрос(
"ВСТАВИТЬ В пользователей (электронная почта, пароль) ЗНАЧЕНИЯ ($1, $2) ВОЗВРАЩЕНИЕ идентификатора, электронной почты, пароля",
[электронная почта, хэш]
);
если (данные.rowCount == 0) возвращатьсяЛОЖЬ;
возвращаться данные.строки[0];
};
Эта функция принимает значения электронной почты и пароля. Он использует предложение INSERT для создания новой строки с этими данными и в случае успеха возвращает только что созданного пользователя. Обратите внимание, что перед сохранением пароля вы должны хешировать его с помощью bcrypt. Никогда не рекомендуется хранить пароли в виде простого текста. Если хакеры получат доступ к вашей пользовательской базе данных, они могут легко получить доступ к конфиденциальной информации.
Установите bcryptjs, чтобы начать его использовать:
npm установить bcryptjs
В helper.js импортируйте bcryptjs:
константа бкрипт = требовать("bcryptjs")
При использовании Bcryptjs база данных хранит только зашифрованный пароль. Поэтому при входе в систему вам нужно будет сравнить простой текстовый пароль, заданный пользователем, и хешированный пароль в базе данных. Для этого вы можете использовать метод сравнения, предоставляемый Bcryptjs.
Создайте функцию с именем matchPassword():
константа матчпароль = асинхронный (пароль, хешпароль) => {
константа совпадение = Ждите bcrypt.compare (пароль, hashPassword);
возвращаться соответствие
};
Он получает простой пароль и хэш, а затем использует Bcrypt.compare() для определения правильности предоставленного пароля. Если это так, он возвращает true, иначе возвращает false.
Это все функции, которые мы будем использовать для взаимодействия с базой данных. Обязательно экспортируйте их все в конце:
модуль.exports = {emailExists, createUser, matchPassword};
Настроить паспорт
Passport — это промежуточное ПО для аутентификации Node, которое предоставляет более 500 стратегий аутентификации, таких как вход через социальные сети, веб-токены JSON (JWT) и аутентификация по электронной почте. Мы будем использовать последний вариант, который обеспечивает стратегия «паспортно-локальный».
Используйте следующую команду для установки паспорта и паспорта-местного:
паспорт установки npm
npm установить паспорт-локальный
Затем настройте Passport для входа в систему существующих пользователей и регистрации новых пользователей.
Начните с создания нового файла паспортConfig.js. Затем импортируйте локальную стратегию Passport и только что созданные вспомогательные функции базы данных:
константа Локальная стратегия = требовать(«паспортно-местный»);
константа { emailExists, createUser, matchPassword } = требовать(""./помощник");
В том же файле добавьте следующее для настройки регистрации пользователя:
модуль.exports = (паспорт) => {
паспорт.использовать(
"местная регистрация",
новый Локальная стратегия(
{
поле имени пользователя: "электронная почта",
поле пароля: "пароль",
},
асинхронный (электронная почта, пароль, готово) => {
пытаться {
константа пользователь существует = Ждите emailExists (электронная почта)если (пользователь существует) {
возвращаться Выполнено(нулевой, ЛОЖЬ);
}
константа пользователь = Ждите createUser (электронная почта, пароль);
возвращаться Выполнено(нулевой, пользователь);
} ловить (ошибка) {
сделано (ошибка);
}
}
)
);
}
Так как паспорт-локальный ожидает имя пользователя и пароль, а вы используете электронную почту, установите в поле имени пользователя адрес электронной почты. Пользователь или, скорее, интерфейсная часть этого приложения отправит адрес электронной почты и пароль в теле запроса. Однако вам не нужно извлекать значения самостоятельно, так как Passport справится с этим в фоновом режиме.
Эта программа сначала проверяет, занято ли электронное письмо, используя функцию emailExists() из helper.js. Если адрес электронной почты не существует в базе данных, он создает нового пользователя с помощью функции createUser(). Наконец, он возвращает пользовательский объект.
Чтобы войти в систему, добавьте следующее вpassportConfig.js:
модуль.exports = (паспорт) => {
паспорт.использовать(
"местная регистрация",
новый Локальная стратегия(
// зарегистрироваться
)
);
паспорт.использовать(
"локальный логин",
новый Локальная стратегия(
{
поле имени пользователя: "электронная почта",
поле пароля: "пароль",
},
асинхронный (электронная почта, пароль, готово) => {
пытаться {
константа пользователь = Ждите emailExists (электронная почта);
если (!пользователь) возвращаться Выполнено(нулевой, ЛОЖЬ);
константа isMatch = Ждите matchPassword(пароль, user.password);
если (!isMatch) возвращаться Выполнено(нулевой, ЛОЖЬ);
возвращаться Выполнено(нулевой, {я бы: ID пользователя, Эл. адрес: user.email});
} ловить (ошибка) {
возвращаться сделано (ошибка, ЛОЖЬ);
}
}
)
);
};
Здесь программа сначала проверяет, зарегистрирована ли электронная почта. Если нет, возвращает false. Если он находит письмо, он сравнивает свой пароль с паролем из запроса. Если пароли совпадают, он регистрирует пользователя и возвращает объект пользователя.
Последним шагом является создание конечных точек API:
- ПОСТ/авторизация/регистрация
- ПОСТ/авторизация/логин
Обе эти конечные точки получат адрес электронной почты и пароль в теле запроса. Они также будут включать функции промежуточного программного обеспечения для проверки подлинности паспорта, которые мы только что настроили.
Импортируйте и настройте Passport в новом файле с именем сервер.js:
константа паспорт = требовать("заграничный пасспорт");
требовать(""./passportConfig")(паспорт);
Затем добавьте следующие маршруты:
приложение.пост(
"/auth/зарегистрироваться",
паспорт.аутентификация("местная регистрация", { сеанс: ЛОЖЬ }),
(запрос, разрешение, следующий) => {
res.json({
пользователь: req.user,
});
}
);
приложение.пост(
"/auth/авторизоваться",
паспорт.аутентификация("локальный логин", { сеанс: ЛОЖЬ }),
(запрос, разрешение, следующий) => {
res.json({ пользователь: req.user });
}
);
Оба этих маршрута в случае успеха возвращают объект JSON, содержащий пользователя.
Проверьте свой API с помощью модульных тестов
Вы можете использовать Passport для аутентификации приложения Node с помощью приложения PostgreSQL. Вы создали конечные точки API для регистрации и входа пользователей.
Хотя вы можете использовать клиенты REST, такие как Postman, для проверки того, насколько хорошо работает API, написание модульных тестов намного проще. Модульные тесты позволяют тестировать отдельные части вашего приложения. Таким образом, даже если конечная точка выйдет из строя, вы сможете определить точную точку отказа. Одним из инструментов, которые вы можете использовать для тестирования приложений Node, является Jest.