Аутентификација корисника је процес верификације идентитета корисника који покушава да приступи вашој апликацији. То укључује ауторизацију и пренос акредитива за потврду аутентичности корисника.

Можете имплементирати једноставан модел аутентификације корисника у Ноде.јс користећи Екпресс, Бцрипт и МонгоДБ, у само неколико корака.

Корак 1: Подешавање развојног окружења

Прво направите фасциклу пројекта и цд у њега покретањем:

мкдир аутентикација корисника
цд Идентификација корисника

Затим иницијализујте нпм у директоријуму вашег пројекта тако што ћете покренути:

нпм инит -и

Тхе флаг иницијализује нпм и креира ваш пацкаге.јсон датотеку са свим њеним подразумеваним вредностима.

Овај модел аутентификације корисника захтева неколико зависности.

То укључује:

  • Изразити: Екпресс је оквир Ноде.јс који пружа робустан скуп функција за веб и мобилне апликације. Олакшава прављење позадинских апликација са Ноде.јс.
  • Бцрипт: бцрипт је нпм пакет који имплементира бцрипт функцију хеширања лозинке. Омогућава вам да креирате хешове од обичних низова лозинки.
  • Монгоосе: Монгоосе је библиотека за моделирање података објеката МонгоДБ. Поједностављује интеракције између ваше апликације и МонгоДБ базе података.
  • дотенв: дотенв је пакет нулте зависности који учитава променљиве окружења из а .енв фајл у процес.енв.
  • Валидатор: валидатор је пакет који садржи различите функције провере стрингова.
  • Боди-парсер: Пакет за анализу тела анализира тела захтева у међуверу пре ваших руковалаца.

Инсталирајте пакете тако што ћете покренути:

нпм инсталирај екпресс бцрипт монгоосе дотенв валидатор тело-парсер

Затим креирајте ан апп.јс датотеку у основном директоријуму вашег пројекта и додајте блок кода испод да бисте креирали основни Екпресс сервер:

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

конст порт = 3000;

апликација.користити(бодиПарсер.јсон());
апликација.усе(бодиПарсер.урленцодед({ продужени: истинито }));

апп.листен (порт, ()=>{
конзола.Пријава(`Апликација слуша порт ${порт}`);
});

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

Корак 2: Повезивање ваше апликације са базом података

У основном директоријуму вашег пројекта креирајте а .енв датотеку и сачувајте своје МонгоДБ акредитиве у њој. Тиме се избегава излагање акредитива ваше базе података у коду који злонамерним корисницима може дати приступ вашој бази података.

Затим идите на свој апп.јс датотека и увоз мунгоса:

конст мунгоосе = захтевају("Мунгос");

Затим позовите увоз дотенв и позовите цонфиг метод на њему:

захтевају ("дотенв").цонфиг();

Позивање цонфиг метод на дотенв учитава променљиве средине у процес.енв.

На крају, позовите метод повезивања Мунгос и проследите свој МонгоДБ УРИ као аргумент:

мунгоосе.цоннецт (процесс.енв. МОНГОДБ_УРИ).онда(() => {
цонсоле.лог('Повезано са базом података успешно')
})

Корак 3: Креирање корисничког модела

У основном директоријуму вашег пројекта креирајте „модели” фолдер; овде ћете чувати свој модел мунгоса:

мкдир модели

Затим креирајте „усерМодел” и додајте следеће увозе:

конст мунгоосе = захтевају('Мунгос')
конст { исЕмаил } = захтевају('валидатор')

исЕмаил је функција валидације која враћа истинито ако је дати стринг имејл. Требаће вам да примените валидацију мунгоса на ваш кориснички модел.

Затим додајте следећи код у свој усерМодел фајл:

// модели/усерМодел
конст усерСцхема = мунгоосе. Шема({
емаил: {
тип: Низ,
потребно: [тачно, 'Емаил је обавезан'],
потврди: {
валидатор: исЕмаил,
порука: реквизити => `${пропс.валуе} није важећа адреса е-поште`
}
},

Лозинка: {
тип: Низ,
потребно: [тачно, 'Потребна је шифра'],
потврди: {
валидатор: функција (вредност) {
повратак вредност.дужина >= 6
},
порука: () =>'Лозинка мора имати најмање шест знакова'
}
}
})

модул.извоза = монгоосе.модел('Корисник', корисничка шема)

Код изнад креира а усерСцхема променљива која чува вредност Мунгос. Шема методом. Мунгоса. Схема метода мапира својства у МонгоДБ колекцију и дефинише облик докумената унутар ње. Шема мунгоса има два својства — ан емаил и а Лозинка— што ће бити ваши захтеви за аутентификацију.

Својство е-поште је стринг типа и има потребан постављено на истинито. Пропратна порука о грешци „Потребна је е-пошта“ ће се приказати ако тело захтева не садржи емаил имовина. Коначно, користећи прилагођену валидацију мунгоса, тхе валидатор имовине реферише тхе исЕмаил функција. Та функција враћа тачно или нетачно на основу ваљаности стринга као е-поште. Тада својство поруке узима вредност е-поште (реквизити) и конструише значајну поруку о грешци.

Својство лозинка је обавезан тип стринга са поруком о грешци која гласи „Потребна је лозинка“. Тхе валидатор функција је анонимна која враћа труе ако лозинка има најмање шест знакова.

Последња линија креира и извози модел мунгоса позивањем модел метод на Мунгос. Проследите назив модела (Корисник) као први аргумент и шема (усерСцхема) као други аргумент.

Корак 4: Имплементација рута за пријаву и регистрацију

У основном директоријуму вашег пројекта креирајте а руте фолдер:

мкдир руте

У фолдеру рута креирајте а усерРоутес.јс датотеку и додајте следеће увозе:

// роутес/усерРоутес.јс
конст екпресс = захтевају("изразити");
конст Корисник = захтевају("../моделс/усерМодел");
конст бцрипт = захтевају("бцрипт");

Направите инстанцу експресног рутера тако што ћете позвати Рутер метод на изразити:

конст рутер = експрес. Роутер();

Затим креирајте своју руту за пријаву додавањем блока кода испод у свој усерРоуте.јс фајл:

роутер.пост("/sign-up", асинц (рек, рес) => {
покушати {
// Извуците е-пошту и лозинку из објекта рек.боди
конст { емаил, лозинка } = рек.боди;

// Провераватиако имејл је већ инкористити
дозволити усерЕкистс = чекати Усер.финдОне({ емаил });

иф (усерЕкистс) {
рес.статус(401).јсон({ порука: „Е-пошта је већ унета користити.&куот; });
повратак;
}

// Дефинишите кругове соли
конст салтРоундс = 10;

// Хеш лозинка
бцрипт.хасх (пассворд, салтРоундс, (ерр, хасх) => {
ако (ерр) бацитиНоваГрешка(„Интерни сервер Грешка");

// Креирај а Новакорисник
дозволити корисник = Нова Корисник({
емаил,
Лозинка: хасх,
});

// Сачувај корисника у бази података
корисник.сачувај().онда(() => {
рес.јсон({ порука: "Корисник је успешно креиран", корисник });
});
});
} улов (ерр) {
повратакрес.статус(401).сенд(ерр.мессаге);
}
});

У блоку кода изнад, прво сте деструктурирали адресу е-поште и лозинку из рек.боди објекат. Затим проверите да ли корисник већ користи имејл јер би требало да буде јединствен за сваког корисника. Ако је е-пошта већ коришћена, враћате се и заустављате извршење кода са статусним кодом 401.

Чување обичних лозинки у бази података представља огромну безбедносну претњу јер злонамерни хакери могу да добију приступ бази података. Требало би да хеширате лозинке пре него што их унесете у своју базу података, тако да чак и ако их хакер открије, не би требало да постоји ризик за кориснике. Хеширање је процес претварања датог „кључа“ у другу вредност. Хеширање је једносмерна функција, што значи да не можете да преузмете оригиналну вредност из хасед, за разлику од шифровања.

Користећи бцрипт, хеширали сте вашу корисничку лозинку позивањем хеш методе на бцрипт. Хеш метода узима три параметра: стринг који треба да се хешује, солне рунде и функцију повратног позива. Проследите корисничку лозинку, променљиву салтРоундс коју сте раније креирали и повратни позив.

Салт рунде се односе на време потребно за израчунавање једног бцрипт хеша. Што су већи кругови соли, то су више рунди хеширања.

Ако хеш метода избаци грешку, ви избацујете „интерну грешку сервера“. У супротном, својство лозинке постављате на успешан хеш и чувате га у својој бази података позивањем методе саве на Корисник инстанце.

Затим креирајте своју руту за пријављивање додавањем блока кода испод у свој усерРоуте.јс фајл:

роутер.пост("/sign-in", асинц (рек, рес) => {
покушати {
// Извуците е-пошту и лозинку из објекта рек.боди
конст { емаил, лозинка } = рек.боди;

// Провераватиакокорисникпостојиинбаза података
дозволити корисник = чекати Усер.финдОне({ емаил });

ако (!корисник) {
врати рес.статус (401).јсон({ порука: "Неважећи акредитив" });
}

// Упоредите лозинке
бцрипт.цомпаре (пассворд, усер.пассворд, (ерр, ресулт) => {
иф (резултат) {
ретурн рес.статус (200).јсон({ мессаге: "Корисник је успешно пријављен" });
}

конзола.лог (ерр);
врати рес.статус (401).јсон({ порука: "Неважећи акредитив" });
});
} улов (грешка) {
рес.статус(401).сенд(ерр.мессаге);
}
});

модул.извоза = рутер;

У блоку кода изнад, прво деструктурирате имејл и лозинку из рек.боди објекат. Затим проверите да ли корисник постоји у вашој бази података. Ако корисник не постоји у вашој бази података, враћате се са статусним кодом 401.

Затим, користећи бцрипт-ов метод поређења, унесите лозинку коју је корисник навео и хеширану лозинку коју сте преузели из своје базе података. Упоредите ова два да бисте потврдили да ли се поклапају. Ако се лозинке поклапају, враћате статусни код 200 и поруку о успеху. У супротном ћете вратити статусни код 401 и поруку о грешци.

Коначно, увоз рутер у свој апп.јс датотеку и користите је као међуверски софтвер на нивоу апликације.

Овим се завршава ваш модел аутентификације корисника; сада, корисници могу безбедно да се пријаве и пријаве на вашу апликацију.

Важност аутентификације корисника

Потврда идентитета корисника осигурава да само легитимни корисници могу добити приступ вашој апликацији. Ако су ваши подаци на било који начин лични или приватни, требало би да предузмете кораке да спречите неауторизоване кориснике да добију приступ.