Искористите структурирану архитектуру Неста да бисте изградили безбедне и ефикасне РЕСТ АПИ-је.

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

Насупрот томе, Нест.јс, изграђен на врху Екпресс.јс и Ноде.јс, уводи апстракцију вишег нивоа који нуди јасну структуру, робустан приступ организацији кода и поједностављену имплементацију детаљима. У суштини, Нест.јс пружа структуриранију архитектуру за изградњу ефикасних и безбедних позадинских АПИ-ја и услуга.

Подешавање Нест.јс пројекта

Да бисте започели, прво морате да инсталирате Нест.јс командну линију (ЦЛИ) глобално тако што ћете покренути наредбу испод:

нпм и -г @нестјс/цли

Када се инсталација заврши, наставите и креирајте нови пројекат тако што ћете покренути:

нест нев нест-јвт-апи

Затим, Нест.јс ЦЛИ ће од вас затражити да изаберете менаџер пакета за инсталирање зависности. За овај водич користићемо нпм, менаџер пакета чворова. Изаберите нпм и сачекајте док ЦЛИ креира основни Нест.јс пројекат и инсталира све потребне конфигурационе датотеке и почетне зависности потребне за покретање апликације.

Након што је пројекат постављен, идите до директоријума пројекта и покрените развојни сервер.

цд нест-јвт-апи
нпм рун старт

На крају, покрените наредбу испод да инсталирате пакете које ћемо користити за овај пројекат.

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

Овде можете пронаћи код овог пројекта ГитХуб спремиште.

Конфигуришите МонгоДБ везу са базом података

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

МОНГО_УРИ="стринг везе"

Затим ажурирајте апп.модуле.тс у срц директоријум да бисте конфигурисали Монгоосе на следећи начин:

увоз { Модул } из'@нестјс/цоммон';
увоз { ЦонфигМодуле } из'@нестјс/цонфиг';
увоз { МонгоосеМодуле} из'@нестјс/монгоосе';
увоз { АппЦонтроллер } из'./апп.цонтроллер';
увоз { АппСервице } из'./апп.сервице';
увоз { УсерАутхМодуле } из'./усер-аутх/усер-аутх.модуле';

@Модуле({
увози: [
ЦонфигМодуле.форРоот({
енвФилеПатх: '.енв',
исГлобал: истина,
}),
МонгоосеМодуле.форРоот (процесс.енв. МОНГО_УРИ),
УсерАутхМодуле,
],
контролери: [АппЦонтроллер],
провајдери: [АппСервице],
})

извозкласа АппМодуле {}

Достављени код конфигурише три основна модула за Нест.јс апликацију: ЦонфигМодуле за конфигурацију окружења, МонгоосеМодуле за успостављање МонгоДБ везе, и УсерАутхМодуле за аутентификацију корисника. Имајте на уму да у овој фази може доћи до грешке јер УсерАутхМодуле још није дефинисан, али ћемо га креирати у следећем одељку.

Креирање модула за аутентификацију корисника

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

нест г модул усер-аутх

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

Можете се одлучити да ручно креирате главне конфигурацијске датотеке пројекта, али ЦЛИ алат поједностављује овај процес аутоматски креирањем потребних ставки, поред ажурирања промена у складу са тим тхе апп.модуле.тс фајл.

Креирајте корисничку шему

Унутар новоствореног корисник-аутх фолдер у срц директоријум, креирајте нови сцхемас/усер-аутх.сцхема.тс датотеку и додајте следећи код да бисте креирали Монгоосе шему за Корисник модел

увоз { Проп, Сцхема, СцхемаФацтори } из'@нестјс/монгоосе';
увоз { Документ } из'Мунгос';

@Сцхема({ временске ознаке: истина })
извозкласа Корисник {
@Проп()
корисничко име: низ;
@Проп()
Лозинка: низ;
}

извозтип УсерДоцумент = Корисник и документ;
извозконст УсерСцхема = СцхемаФацтори.цреатеФорЦласс (Корисник);

Креирање услуге аутентификације корисника

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

нест г сервице усер-аутх

Ова команда ће креирати а усер-аутх.сервице.тс датотеку у директоријуму усер-аутх. Отворите ову датотеку и ажурирајте је следећим кодом.

  1. Прво направите следеће увозе.
    увоз { Ињецтабле, НотФоундЕкцептион, Логгер, УнаутхоризедЕкцептион } из'@нестјс/цоммон';
    увоз { ИњецтМодел } из'@нестјс/монгоосе';
    увоз { Модел } из'Мунгос';
    увоз { Усер } из'./сцхемас/усер-аутх.сцхема';
    увоз * као бцрипт из'бцрипт';
    увоз { ЈвтСервице } из'@нестјс/јвт';
  2. Затим креирајте а УсерАутхСервице класа која обухвата функционалност за регистрацију корисника, пријаву и преузимање свих рута корисничких података.
@Ињецтабле()
извозкласа УсерАутхСервице {
приватни само за читање логгер = Нова Логгер (УсерАутхСервице.наме);
конструктор(@ИњецтМодел(Корисничко име) приватни усерМодел: Модел, приватни јвтСервице: ЈвтСервице) {}

асинц регистерУсер (корисничко име: низ, Лозинка: низ): Обећавамниз }> {
покушати {
конст хасх = чекати бцрипт.хасх (лозинка, 10);
чекатиово.усерМодел.цреате({ корисничко име, лозинка: хеш });
повратак { порука: 'Корисник је успешно регистрован' };
} улов (грешка) {
бацитиНоваГрешка(„Дошло је до грешке приликом регистрације корисника“);
}
 }

асинц логинУсер (корисничко име: низ, Лозинка: низ): Обећавам<низ> {
покушати {
конст корисник = чекатиово.усерМодел.финдОне({ корисничко име });
ако (!корисник) {
бацитиНова НотФоундЕкцептион('Корисник није пронађен');
}
конст пассвордМатцх = чекати бцрипт.цомпаре (пассворд, усер.пассворд);
ако (!пассвордМатцх) {
бацитиНова УнаутхоризедЕкцептион('Неважећи акредитиви за пријаву');
}
конст паилоад = { усерИд: усер._ид };
конст токен = ово.јвтСервице.сигн (корисно оптерећење);
повратак токен;
} улов (грешка) {
конзола.лог (грешка);
бацитиНова УнаутхоризедЕкцептион(„Дошло је до грешке приликом пријављивања“);
}
}

асинц гетУсерс(): Обећавам {
покушати {
конст корисници = чекатиово.усерМодел.финд({});
повратак корисници;
} улов (грешка) {
ово.логгер.еррор(`Дошло је до грешке при преузимању корисника: ${еррор.мессаге}`);
бацитиНоваГрешка(„Дошло је до грешке при преузимању корисника“);
}
}
}

Тхе УсерАутхСервице цласс имплементира логику регистрације корисника, пријављивања и преузимања корисничких података. Користи се усерМодел за интеракцију са базом података и обављање потребних радњи укључујући хеширање лозинке током регистрација, валидација акредитива за пријаву, и на крају, генерисање ЈВТ токена након успешног Аутентикација.

Имплементација Аутхентицатион Гуард-а

Да би се осигурала сигурност осетљивих ресурса, кључно је ограничити приступ искључиво на овлашћене кориснике. Ово се постиже применом безбедносне мере која налаже присуство важећег ЈВТ-а у наредним АПИ захтевима упућеним заштићеним крајњим тачкама, у овом случају, корисника рута. У корисник-аутх директоријум, креирајте нови аутх.гуард.тс датотеку и додајте код испод.

увоз { ЦанАцтивате, ЕкецутионЦонтект, Ињецтабле, УнаутхоризедЕкцептион } из'@нестјс/цоммон';
увоз { ЈвтСервице } из'@нестјс/јвт';
увоз { Захтев } из'изразити';
увоз { тајни кључ } из'./цонфиг';

@Ињецтабле()
извозкласа АутхГуард имплементира ЦанАцтивате {
конструктор(приватни јвтСервице: ЈвтСервице) {}

асинц цанАцтивате (контекст: ЕкецутионЦонтект): Обећавам<боолеан> {
конст захтев = цонтект.свитцхТоХттп().гетРекуест();
конст токен = ово.ектрацтТокенФромХеадер (захтев);
ако (!токен) {
бацитиНова УнаутхоризедЕкцептион();
}
покушати {
конст носивост = чекатиово.јвтСервице.верифиАсинц (токен, {
тајна: сецретКеи.сецрет,
});
захтев['корисник'] = носивост;
} улов {
бацитиНова УнаутхоризедЕкцептион();
}
повратакистина;
}
приватни ектрацтТокенФромХеадер (захтев: Захтев): низ | недефинисан {
конст [тип, токен] = рекуест.хеадерс.аутхоризатион?.сплит(' ')?? [];
повратактип'носилац'? токен: недефинисан;
}
}

Код имплементира а чувар, како је наведено у званичној документацији, како би заштитили руте и осигурали да им приступе само аутентификовани корисници са важећим ЈВТ токеном.

Извлачи ЈВТ токен из заглавља захтева, проверава његову аутентичност помоћу ЈвтСервице, и додељује декодирано корисно оптерећење захтев ['корисник'] имовине за даљу обраду. Ако токен недостаје или је неважећи, он баца ан УнаутхоризедЕкцептион да спречи приступ заштићеној рути.

Сада, креирајте цонфиг.тс датотеку у истом директоријуму и додајте код испод.

извозконст тајни кључ = {
тајна: „ВРЕДНОСТ СЕКТРА.“,
};

Овај тајни кључ се користи за потписивање и проверу аутентичности ЈВТ-ова. Од суштинског је значаја да безбедно ускладиштите вредност кључа да бисте спречили неовлашћени приступ и заштитили интегритет ЈВТ-ова.

Дефинишите АПИ контролер

Креирајте контролер који рукује крајњим тачкама АПИ-ја за аутентификацију корисника.

нест г контролер корисник-аутх

Затим копирајте код наведен у овоме ГитХуб датотека спремишта, и додајте га у усер-аутх.цонтроллер.тс датотека—дефинише крајње тачке за регистрацију корисника, пријављивање и преузимање корисничких података. Тхе УсеГуардс (АутхГуард) декоратор је укључен да би се извршила аутентификација за гетУсерс крајња тачка, обезбеђујући да само аутентификовани корисници имају приступ.

Ажурирајте датотеку усер-аутх.модуле.тс

Да бисте одразили промене направљене на пројекту, ажурирајте усер-аутх.модуле.тс датотеку за конфигурисање потребних модула, услуга и контролера за аутентификацију корисника.

увоз { Модул, НестМодуле, МиддлевареЦонсумер } из'@нестјс/цоммон';
увоз { ЈвтМодуле } из'@нестјс/јвт';
увоз { УсерАутхЦонтроллер } из'./усер-аутх.цонтроллер';
увоз { УсерАутхСервице } из'./усер-аутх.сервице';
увоз { МонгоосеМодуле} из'@нестјс/монгоосе';
увоз {Корисничка шема} из'./сцхемас/усер-аутх.сцхема';
увоз { тајни кључ } из'./цонфиг';

@Модуле({
увози: [
МонгоосеМодуле.форФеатуре([{ наме: 'Корисник', шема: Корисничка шема }]),
ЈвтМодуле.регистер({
тајна: сецретКеи.сецрет,
сигнОптионс: { екпиресИн: '1х' },
}),
],
контролери: [УсерАутхЦонтроллер],
добављачи: [УсерАутхСервице],
})

извозкласа УсерАутхМодуле имплементира НестМодуле {
конфигуриши (потрошач: МиддлевареЦонсумер) {
}
}

На крају, покрените развојни сервер и тестирајте крајње тачке АПИ-ја користећи Постман.

нпм рун старт

Изградња безбедних Нест.јс РЕСТ АПИ-ја

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

Поред тога, давањем приоритета безбедности у свакој фази развоја АПИ-ја, можете да обезбедите безбедност својих позадинских система.