Као програмер, ваша је одговорност да заштитите податке својих корисника путем аутентификације. Пасспорт.јс можете користити за аутентификацију корисника у Ноде и Постгрес апликацији.

Почните тако што ћете креирати Ноде сервер са крајњим тачкама за регистрацију, пријављивање и одјављивање корисника. Можете дозволити да Пасспорт управља аутентификацијом да бисте ограничили неовлашћени приступ вашој апликацији.

Креирање табеле корисника

За аутентификацију корисника, користићете имејл и лозинку. То значи да табела корисника мора да садржи поље е-поште и лозинке. У командној линији пскл креирајте нову базу података под називом нодеапп:

КРЕИРАЈБАЗА ПОДАТАКА нодеапп;

Затим направите табелу за складиштење корисника:

КРЕИРАЈСТОкорисника (
ид ИНТ ГЕНЕРИСАНО УВЕК КАО ПРИМАРНИ КЉУЧ ИДЕНТИТЕТА,
емаил ЦХАР(128),
лозинка ЦХАР(60)
);

Овај код ће креирати нову табелу која садржи е-пошту, лозинку и аутоматски генерисано ИД поље.

Креирање чворног сервера

Ноде.јс је окружење за извршавање ЈаваСцрипт на страни сервера које нам омогућава да брзо креирамо ХТТП сервере. Да бисте поједноставили процес креирања сервера и различитих ХТТП рута, можете користити

instagram viewer
Екпресс, Ноде.јс веб оквир.

Покрените ову команду да бисте креирали нову фасциклу под називом постгрес-аутх:

мкдир постгрес-аутх

Затим иницијализујте нпм:

нпм инит -и

Коначно, инсталирајте Екпресс:

нпм инсталл екпресс

Можете сада креирајте веб сервер Ноде.

У новом фајлу под називом индек.јс, додајте следеће:

конст екпресс = захтевају("изразити");
конст апп = екпресс();
апп.усе (екпресс.јсон());
апп.усе (екпресс.урленцодед({ продужени: истинито }));
апп.листен(3000, () => конзола.лог("Слушање на порту 3000"));

Покретање овог кода ће покренути сервер и пријавити следеће на конзоли:

Слушање на порту 3000

Повезивање на ПостгреСКЛ

До повежите се на ПостгреСКЛ користити ноде-постгрес. ноде-постгрес је драјвер за повезивање који обезбеђује интерфејс између Ноде-а и Постгреса.

Извршите следеће да бисте инсталирали ноде-постргес преко нпм-а:

нпм инсталл стр

Када инсталирате ту библиотеку, креирајте нову датотеку под називом дб.јс и повежите га са базом података:

конст {Клијент} = захтевају("пг");
конст { корисник, хост, база података, лозинка, порт } = захтевају("./дбЦонфиг");

конст клијент = Нова Клијент({
корисник,
домаћин,
база података,
Лозинка,
Лука,
});

цлиент.цоннецт();
модул.екпортс = клијент;

Клијентски метод из ноде-постгрес преузима детаље базе података на коју се повезујете. Овај програм увози детаље своје везе из датотеке под називом дбЦонфиг. Стога, креирајте ту датотеку и додајте јој следећи код:

модул.екпортс = {
корисник: "постгрес",
хост: "лоцалхост",
база података: "нодеапп",
лозинка: "ваша лозинка",
Лука: 5432,
};

Креирајте помоћне функције базе података

Увек је добра пракса користити појединачне функције за интеракцију са базом података. Они олакшавају писање јединичних тестова и побољшавају поновну употребу. За крајњу тачку за регистрацију, потребно је да креирате две функције:

  1. Да проверите да ли је имејл већ регистрован.
  2. Да бисте креирали корисника.

Циљ је регистровати корисника само ако не постоји у бази података.

Креирајте нову датотеку под називом хелпер.јс и увезите клијента базе података из дб.јс:

конст клијент = захтевају("./дб.јс")

Затим додајте нову функцију под називом емаилЕкистс():

конст емаилЕкистс = асинц (е-пошта) => {
конст подаци = чекати цлиент.куери("СЕЛЕЦТ * ФРОМ усерс ВХЕРЕ емаил=$1", [
емаил,
]);

ако (дата.ровЦоунт == 0) повратаклажно;
повратак дата.ровс[0];
};

Ова функција узима е-пошту и проверава да ли је већ у употреби. То ради помоћу клаузуле СЕЛЕЦТ која враћа ред који има поље е-поште које одговара вредности коју је дао корисник који се региструје. Ако имејл не постоји, враћа се нетачно.

Да бисте креирали функцију која креира корисника, додајте функцију под називом цреатеУсер() у хелпер.јс:

конст цреатеУсер = асинц (е-пошта, лозинка) => {
конст сол = чекати бцрипт.генСалт(10);
конст хасх = чекати бцрипт.хасх (лозинка, сол);

конст подаци = чекати цлиент.куери(
„ИНСЕРТ ИНТО усерс (е-маил, пассворд) ВАЛУЕС ($1, $2) ВРАЋАЊЕ ИД-а, е-поште, лозинке",
[е-пошта, хеш]
);

ако (дата.ровЦоунт == 0) повратаклажно;
повратак дата.ровс[0];
};

Ова функција узима вредности е-поште и лозинке. Користи ИНСЕРТ клаузулу да креира нови ред са овим детаљима и ако је успешан враћа новокреираног корисника. Имајте на уму да пре него што сачувате лозинку, требало би хеширајте га користећи бцрипт. Никада није добра идеја чувати лозинке као обичан текст. Ако би хакери добили приступ вашој корисничкој бази података, могли би лако приступити осетљивим информацијама.

Инсталирајте бцриптјс да бисте почели да га користите:

нпм инсталл бцриптјс

У хелпер.јс увезите бцриптјс:

конст бцрипт = захтевају(„бцриптјс“)

Коришћењем Бцриптјс-а, база података чува само шифровану лозинку. Због тога, током пријављивања, мораћете да упоредите лозинку обичног текста коју је дао корисник и хеширану лозинку у бази података. За ово можете користити метод поређења који пружа Бцриптјс.

Направите функцију под називом матцхПассворд():

конст матцхПассворд = асинц (лозинка, хасхПассворд) => {
конст матцх = чекати бцрипт.цомпаре (пассворд, хасхПассворд);
повратак утакмица
};

Он прима обичну лозинку и хеш, а затим користи Бцрипт.цомпаре() да утврди да ли је дата лозинка исправна. Ако јесте, враћа тачно у супротном, враћа нетачно.

Ово су све функције које ћемо користити за интеракцију са базом података. Обавезно извезите све на крају:

модул.екпортс = { емаилЕкистс, цреатеУсер, матцхПассворд };

Конфигуришите пасош

Пасош је међувертик за аутентификацију чвора који пружа преко 500 стратегија аутентификације као што су пријава на друштвеним мрежама, ЈСОН веб токени (ЈВТ) и аутентификација путем е-поште. Користићемо ово друго које предвиђа пасошко-локална стратегија.

Користите следећу команду да инсталирате пасош и пасош-лоцал:

нпм инсталл пасош
нпм инсталл пасспорт-лоцал

Затим конфигуришите Пасспорт за пријаву постојећих корисника и регистрацију нових корисника.

Почните креирањем нове датотеке пасспортЦонфиг.јс. Затим увезите локалну стратегију Пасоша и помоћне функције базе података које сте управо креирали:

конст ЛоцалСтратеги = захтевају("пасош-локални");
конст { емаилЕкистс, цреатеУсер, матцхПассворд } = захтевају("./хелпер");

У истој датотеци додајте следеће да бисте подесили регистрацију корисника:

модул.екпортс = (пасош) => {
пасош.употреба(
"локално пријављивање",
Нова Локална стратегија(
{
корисничко имеФиелд: "емаил",
пассвордФиелд: "пассворд",
},
асинц (е-пошта, лозинка, готово) => {
покушати {
конст усерЕкистс = чекати емаил постоји (е-пошта)

ако (постоји корисник) {
повратак Готово(нула, лажно);
}

конст корисник = чекати цреатеУсер (е-маил, лозинка);
повратак Готово(нула, корисник);
} улов (грешка) {
урађено (грешка);
}
}
)
);
}

Пошто паспорт-лоцал очекује корисничко име и лозинку, а ви користите е-пошту, подесите поље корисничког имена на имејл. Корисник, односно фронтенд део ове апликације ће послати имејл и лозинку у телу захтева. Међутим, не морате сами да извлачите вредности јер ће Пасспорт то решавати у позадини.

Овај програм прво проверава да ли је е-пошта већ преузета помоћу функције емаилЕкистс() из хелпер.јс. Ако имејл не постоји у бази података, креира новог корисника са функцијом цреатеУсер(). Коначно, враћа објекат корисника.

Да бисте пријавили кориснике, додајте следеће у пасспортЦонфиг.јс:

модул.екпортс = (пасош) => {
пасош.употреба(
"локално пријављивање",
Нова Локална стратегија(
// пријави се
)
);
пасош.употреба(
"локална пријава",
Нова Локална стратегија(
{
корисничко имеФиелд: "емаил",
пассвордФиелд: "пассворд",
},
асинц (е-пошта, лозинка, готово) => {
покушати {
конст корисник = чекати емаилЕкистс (е-пошта);
ако (!корисник) повратак Готово(нула, лажно);
конст исМатцх = чекати матцхПассворд (пассворд, усер.пассворд);
ако (!исМатцх) повратак Готово(нула, лажно);
повратак Готово(нула, {ид: ИД корисник, емаил: усер.емаил});
} улов (грешка) {
повратак урађено (грешка, лажно);
}
}
)
);
};

Овде програм прво проверава да ли је имејл регистрован. Ако није, враћа се нетачно. Ако пронађе имејл, упоређује своју лозинку са оном из захтева. Ако се лозинке подударају, пријављује корисника и враћа кориснички објекат.

Последњи корак је креирање крајњих тачака АПИ-ја:

  • ПОСТ /аутх/сигнуп
  • ПОСТ /аутх/логин

Обе ове крајње тачке ће добити е-пошту и лозинку у телу захтева. Они ће такође укључити функције средњег софтвера за аутентификацију пасоша које смо управо конфигурисали.

Увезите и подесите Пасош у новој датотеци под називом сервер.јс:

конст пасош = захтевају(„пасош“);
захтевају("./пасспортЦонфиг")(пасош);

Затим додајте следеће руте:

апп.пост(
"/auth/пријави се",
пасспорт.аутхентицате("лоцал-сигнуп", { седница: лажно }),
(рек, рес, нект) => {
рес.јсон({
корисник: рек.усер,
});
}
);
апп.пост(
"/auth/Пријавите се",
пасспорт.аутхентицате("лоцал-логин", { седница: лажно }),
(рек, рес, нект) => {
рес.јсон({ корисник: рек.усер });
}
);

Обе ове руте враћају ЈСОН објекат који садржи корисника ако је успешан.

Проверите свој АПИ помоћу тестова јединица

Можете користити Пасспорт за аутентификацију Ноде апликације помоћу ПостгреСКЛ апликације. Направили сте АПИ крајње тачке да бисте се пријавили и пријавили кориснике.

Иако можете да користите РЕСТ клијенте као што је Постман да бисте тестирали колико добро функционише АПИ, писање јединичних тестова је много једноставније. Јединични тестови вам омогућавају да тестирате појединачне делове ваше апликације. На овај начин, чак и ако крајња тачка не успе, можете тачно одредити тачку неуспеха. Један од алата који можете користити за тестирање Ноде апликација је Јест.