Като разработчик, ваша отговорност е да защитите данните на вашите потребители чрез удостоверяване. Можете да използвате Passport.js за удостоверяване на потребители в приложение Node и Postgres.
Започнете със създаване на Node сървър с крайни точки за регистриране, влизане и излизане на потребители. Можете да позволите на Passport да обработва удостоверяване, за да ограничи неоторизиран достъп до вашето приложение.
Създаване на таблица с потребители
За удостоверяване на потребителя ще използвате имейл и парола. Това означава, че таблицата с потребители трябва да съдържа поле за имейл и парола. В командния ред на psql създайте нова база данни, наречена nodeapp:
СЪЗДАВАЙТЕБАЗА ДАННИ nodeapp;
След това създайте таблица за съхраняване на потребителите:
СЪЗДАВАЙТЕТАБЛИЦАпотребители (
id INT ГЕНЕРИРАН ВИНАГИ КАТО ОСНОВЕН КЛЮЧ ЗА ИДЕНТИТИЧНОСТ,
имейл CHAR(128),
парола CHAR(60)
);
Този код ще създаде нова таблица, съдържаща имейл, парола и автоматично генерирано ID поле.
Създаване на възлов сървър
Node.js е среда за изпълнение на JavaScript от страна на сървъра, която ни позволява бързо да създаваме HTTP сървъри. За да опростите процеса на създаване на сървъра и различни HTTP маршрути, можете да използвате
Express, уеб рамка Node.js.Изпълнете тази команда, за да създадете нова папка, наречена postgres-auth:
mkdir postgres-auth
След това инициализирайте npm:
npm init -y
Накрая инсталирайте Express:
npm инсталирайте експресно
Вече можете създайте уеб сървъра Node.
В нов файл, наречен index.js, добавете следното:
конст експрес = изискват("експресен");
конст приложение = експрес();
app.use (express.json());
app.use (express.urlencoded({ удължен: вярно }));
app.listen(3000, () => конзола.log("Слушане на порт 3000"));
Изпълнението на този код ще стартира сървъра и ще регистрира следното в конзолата:
Слушане на порт 3000
Свързване към PostgreSQL
Да се свържете се с PostgreSQL използване възел-postgres. node-postgres е драйвер за връзка, който осигурява интерфейс между Node и Postgres.
Изпълнете следното, за да инсталирате node-postrges чрез npm:
npm инсталирайте pg
След като инсталирате тази библиотека, създайте нов файл, наречен db.js и го свържете към базата данни:
конст {Клиент} = изискват("pg");
конст {потребител, хост, база данни, парола, порт} = изискват("./dbConfig");конст клиент = нов Клиент ({
потребител,
домакин,
база данни,
парола,
порт,
});
client.connect();
модул.exports = клиент;
Клиентският метод от node-postgres взема подробностите за базата данни, към която се свързвате. Тази програма импортира своите подробности за връзката от файл, наречен dbConfig. Затова създайте този файл и добавете следния код към него:
модул.exports = {
потребител: "postgres",
хост: "localhost",
база данни: "nodeapp",
парола: "вашата парола",
порт: 5432,
};
Създаване на помощни функции за база данни
Винаги е добра практика да използвате отделни функции за взаимодействие с базата данни. Те улесняват писането на модулни тестове и подобряват повторната употреба. За крайната точка за регистрация трябва да създадете две функции:
- За да проверите дали имейлът вече е регистриран.
- За да създадете потребителя.
Целта е да се регистрира потребител само ако той не съществува в базата данни.
Създайте нов файл, наречен helper.js и импортирайте клиента на базата данни от db.js:
конст клиент = изискват("./db.js")
След това добавете нова функция, наречена emailExists():
конст имейлСъществува = асинхронен (имейл) => {
конст данни = изчакайте client.query("SELECT * FROM потребители WHERE email=$1", [
електронна поща,
]);
ако (data.rowCount == 0) връщаненевярно;
връщане data.rows[0];
};
Тази функция приема имейл и проверява дали вече се използва. Той прави това, като използва клаузата SELECT, която връща ред, който има имейл поле, което съответства на стойността, предоставена от регистрирания потребител. Ако имейлът не съществува, той връща false.
За да създадете функция, която създава потребителя, добавете функция, наречена createUser() към helper.js:
конст createUser = асинхронен (имейл, парола) => {
конст сол = изчакайте bcrypt.genSalt(10);
конст хеш = изчакайте bcrypt.hash (парола, сол);конст данни = изчакайте client.query(
„ВМЪКНЕТЕ В потребители (имейл, парола) СТОЙНОСТИ ($1, $2) ВРЪЩАНЕ на идентификатор, имейл, парола",
[имейл, хеш]
);
ако (data.rowCount == 0) връщаненевярно;
връщане data.rows[0];
};
Тази функция приема стойностите за имейл и парола. Той използва клаузата INSERT, за да създаде нов ред с тези подробности и при успех връща новосъздадения потребител. Имайте предвид, че преди да съхраните паролата, трябва хеширайте го с помощта на bcrypt. Никога не е добра идея да съхранявате паролите като обикновен текст. Ако хакерите получиха достъп до вашата потребителска база данни, те лесно биха могли да получат достъп до чувствителна информация.
Инсталирайте bcryptjs, за да започнете да го използвате:
npm инсталира bcryptjs
В helper.js импортирайте bcryptjs:
конст bcrypt = изискват("bcryptjs")
Използвайки Bcryptjs, базата данни съхранява само шифрованата парола. Следователно, по време на влизане ще трябва да сравните паролата с обикновен текст, дадена от потребителя, и хешираната парола в базата данни. За целта можете да използвате метода за сравнение, предоставен от Bcryptjs.
Създайте функция, наречена matchPassword():
конст matchPassword = асинхронен (парола, hashPassword) => {
конст мач = изчакайте bcrypt.compare (парола, hashPassword);
връщане съвпада
};
Той получава обикновената парола и хеша и след това използва Bcrypt.compare(), за да определи дали предоставената парола е правилна. Ако е така, връща true, в противен случай връща false.
Това са всички функции, които ще използваме за взаимодействие с базата данни. Уверете се, че сте експортирали всички от тях в края:
модул.exports = { emailExists, createUser, matchPassword };
Конфигуриране на паспорт
Passport е междинен софтуер за удостоверяване на Node, който предоставя над 500 стратегии за удостоверяване като социално влизане, JSON уеб токени (JWT) и удостоверяване по имейл. Ще използваме последното, което предоставя паспортно-местната стратегия.
Използвайте следната команда, за да инсталирате passport и passport-local:
npm инсталирайте паспорт
npm инсталирайте passport-local
След това конфигурирайте Passport за влизане на съществуващи потребители и регистриране на нови потребители.
Започнете със създаване на нов файл passportConfig.js. След това импортирайте локалната стратегия на Passport и помощните функции на базата данни, които току-що създадохте:
конст LocalStrategy = изискват("паспорт-местен");
конст { emailExists, createUser, matchPassword } = изискват("./помощник");
В същия файл добавете следното, за да настроите потребителска регистрация:
модул.exports = (паспорт) => {
passport.use(
"локална регистрация",
нов LocalStrategy(
{
потребителско имеПоле: "имейл",
passwordField: "парола",
},
асинхронен (имейл, парола, готово) => {
опитвам {
конст userExists = изчакайте emailExists (имейл)ако (userExists) {
връщане Свършен(нула, невярно);
}
конст потребител = изчакайте createUser (имейл, парола);
връщане Свършен(нула, потребител);
} улов (грешка) {
готово (грешка);
}
}
)
);
}
Тъй като passport-local очаква потребителско име и парола, а вие използвате имейл, задайте полето за потребителско име на имейл. Потребителят или по-скоро предната част на това приложение ще изпрати имейла и паролата в тялото на заявката. Не е необходимо обаче да извличате стойностите сами, тъй като Passport ще се справи с това във фонов режим.
Тази програма първо проверява дали имейлът вече е взет с помощта на функцията emailExists() от helper.js. Ако имейлът не съществува в базата данни, той създава нов потребител с функцията createUser(). Накрая връща потребителския обект.
За да влезете в потребители, добавете следното към passportConfig.js:
модул.exports = (паспорт) => {
passport.use(
"локална регистрация",
нов LocalStrategy(
// Регистрирай се
)
);
passport.use(
"локално влизане",
нов LocalStrategy(
{
потребителско имеПоле: "имейл",
passwordField: "парола",
},
асинхронен (имейл, парола, готово) => {
опитвам {
конст потребител = изчакайте имейлСъществува (имейл);
ако (! потребител) връщане Свършен(нула, невярно);
конст isMatch = изчакайте matchPassword (парола, user.password);
ако (!isMatch) връщане Свършен(нула, невярно);
връщане Свършен(нула, {документ за самоличност: user.id, електронна поща: user.email});
} улов (грешка) {
връщане готово (грешка, невярно);
}
}
)
);
};
Тук програмата първо проверява дали имейлът е регистриран. Ако не, връща false. Ако намери имейла, сравнява паролата си с тази от заявката. Ако паролите съвпадат, той влиза като потребител и връща потребителския обект.
Последната стъпка е да създадете крайните точки на API:
- POST /auth/signup
- POST /auth/login
И двете крайни точки ще получат имейл и парола в тялото на заявката. Те също ще включват функциите на междинния софтуер за удостоверяване на паспорта, които току-що конфигурирахме.
Импортирайте и настройте Passport в нов файл с име server.js:
конст паспорт = изискват("паспорт");
изискват("./passportConfig")(паспорт);
След това добавете следните маршрути:
app.post(
"/auth/Регистрирай се",
passport.authenticate("local-signup", { сесия: невярно }),
(req, res, next) => {
res.json({
потребител: req.user,
});
}
);
app.post(
"/auth/Влизам",
passport.authenticate("local-login", { сесия: невярно }),
(req, res, next) => {
res.json({ потребител: req.user });
}
);
И двата маршрута връщат JSON обект, съдържащ потребителя, ако са успешни.
Проверете вашия API с помощта на Unit Tests
Можете да използвате Passport за удостоверяване на приложение Node с помощта на приложение PostgreSQL. Създадохте крайни точки на API, за да регистрирате и влизате потребители.
Докато можете да използвате REST клиенти като Postman, за да тествате колко добре работи API, писането на модулни тестове е много по-лесно. Единичните тестове ви позволяват да тествате отделните части на вашето приложение. По този начин, дори ако дадена крайна точка се повреди, можете да посочите точната точка на повреда. Един от инструментите, които можете да използвате за тестване на приложения на Node, е Jest.