Iskoristite Nestovu strukturiranu arhitekturu za izgradnju sigurnih i učinkovitih REST API-ja.

Express.js je izvrsna tehnologija za izgradnju sigurnih i robusnih REST API-ja, međutim, ne pruža unaprijed definiranu strukturu. Njegova minimalistička priroda omogućuje vam rukovanje bitnim aspektima poput usmjeravanja, organizacije koda i sigurnosnih mjera bilo ručno ili korištenjem dostupnog međuprograma i biblioteka.

Nasuprot tome, Nest.js, izgrađen na temelju Express.js i Node.js, uvodi apstrakciju više razine koji nudi jasnu strukturu, robustan pristup organizaciji koda i pojednostavljenu implementaciju pojedinosti. U biti, Nest.js pruža strukturiraniju arhitekturu za izgradnju učinkovitih i sigurnih pozadinskih API-ja i usluga.

Postavljanje Nest.js projekta

Da biste započeli, prvo trebate globalno instalirati naredbeni redak (CLI) Nest.js-a pokretanjem naredbe u nastavku:

npm i -g @nestjs/cli

Nakon dovršetka instalacije, samo naprijed i izradite novi projekt tako da pokrenete:

ugnijezditi novi nest-jwt-api
instagram viewer

Zatim će Nest.js CLI od vas zatražiti da odaberete upravitelja paketa za instaliranje ovisnosti. Za ovaj vodič ćemo koristiti npm, upravitelj paketa čvora. Izaberi npm i pričekajte dok CLI kreira osnovni Nest.js projekt i instalira sve potrebne konfiguracijske datoteke i početne ovisnosti potrebne za pokretanje aplikacije.

Nakon što je projekt postavljen, dođite do direktorija projekta i pokrenite razvojni poslužitelj.

cd nest-jwt-api
npm pokrenuti početak

Na kraju, pokrenite naredbu u nastavku da instalirate pakete koje ćemo koristiti za ovaj projekt.

npm instalirajte mongodb mongoose @nestjs/mongoose @types/bcrypt bcrypt jsonwebtoken @nestjs/jwt

Kôd ovog projekta možete pronaći ovdje GitHub spremište.

Konfigurirajte MongoDB vezu s bazom podataka

Postavite MongoDB bazu podataka lokalno ili konfigurirati MongoDB klaster u oblaku. Nakon postavljanja baze podataka, kopirajte URI niz veze baze podataka, kreirajte a .env datoteku u korijenskom direktoriju mape našeg projekta i zalijepite niz za povezivanje:

MONGO_URI="niz veze"

Zatim ažurirajte app.module.ts u src datoteku direktorija za konfiguraciju Mongoosea na sljedeći način:

uvoz { Modul } iz'@nestjs/common';
uvoz { ConfigModule } iz'@nestjs/config';
uvoz { MongooseModule } iz'@nestjs/mungos';
uvoz {AppController} iz'./app.controller';
uvoz { AppService } iz'./app.service';
uvoz { UserAuthModule } iz'./user-auth/user-auth.module';

@Modul({
uvozi: [
ConfigModule.forRoot({
envFilePath: '.env',
jeGlobalno: pravi,
}),
MongooseModule.forRoot (process.env. MONGO_URI),
UserAuthModule,
],
kontroleri: [AppController],
pružatelji usluga: [AppService],
})

izvozrazreda AppModule {}

Priloženi kod konfigurira tri bitna modula za aplikaciju Nest.js: ConfigModule za konfiguraciju okruženja, MongooseModule za uspostavljanje MongoDB veze, i UserAuthModule za autentifikaciju korisnika. Imajte na umu da u ovoj fazi može doći do pogreške jer UserAuthModule još nije definiran, ali ćemo ga izraditi u sljedećem odjeljku.

Stvaranje modula za autentifikaciju korisnika

Kako biste održali čist i dobro organiziran kod, izradite modul za provjeru autentičnosti korisnika pokretanjem sljedeće naredbe.

nest g modul user-auth

CLI alat Nest.js automatski generira potrebne datoteke modula. Osim toga, ažurirat će app.module.ts datoteku koja uključuje potrebne promjene u vezi s modulom za provjeru autentičnosti korisnika.

Možete odabrati ručno stvaranje konfiguracijskih datoteka glavnog projekta, ali CLI alat pojednostavljuje ovaj proces automatski stvara potrebne stavke, uz odgovarajuće ažuriranje promjena the app.module.ts datoteka.

Stvorite korisničku shemu

Unutar novostvorenog autorizacija korisnika mapu u src imenik, stvorite novi schemas/user-auth.schema.ts datoteku i dodajte sljedeći kod za stvaranje Mongoose sheme za Korisnik model

uvoz {Prop, Schema, SchemaFactory} iz'@nestjs/mungos';
uvoz { Dokument } iz'mungos';

@Shema({ vremenske oznake: pravi })
izvozrazreda Korisnik {
@Prop()
Korisničko ime: niz;
@Prop()
lozinka: niz;
}

izvoztip UserDocument = Korisnik & Dokument;
izvozkonst UserSchema = SchemaFactory.createForClass (Korisnik);

Stvaranje usluge autentifikacije korisnika

Kreirajmo sada uslugu provjere autentičnosti korisnika koja će upravljati logikom provjere autentičnosti za REST API izvođenjem naredbe ispod:

nest g usluga autentifikacija korisnika

Ova naredba će stvoriti a korisnik-auth.service.ts datoteku unutar direktorija za autorizaciju korisnika. Otvorite ovu datoteku i ažurirajte je sljedećim kodom.

  1. Prvo izvršite sljedeće uvoze.
    uvoz {Injectable, NotFoundException, Logger, UnauthorizedException} iz'@nestjs/common';
    uvoz {InjectModel} iz'@nestjs/mungos';
    uvoz { Model } iz'mungos';
    uvoz { Korisnik } iz'./schemas/user-auth.schema';
    uvoz * kao bcrypt iz'bcrypt';
    uvoz {JwtService} iz'@nestjs/jwt';
  2. Zatim stvorite a UserAuthService klasa koja sažima funkcionalnost za registraciju korisnika, prijavu i dohvaćanje svih ruta korisničkih podataka.
@Injekcioni()
izvozrazreda UserAuthService {
privatna zapisnik samo za čitanje = novi Logger (UserAuthService.name);
konstruktor(@InjectModel(Korisničko ime) privatna userModel: Model, privatna jwtService: JwtService) {}

asinkroni registerUser (korisničko ime: niz, lozinka: niz): Obećanjeniz }> {
probati {
konst hash = čekati bcrypt.hash (lozinka, 10);
čekatiovaj.userModel.create({ korisničko ime, lozinka: hash });
povratak { poruka: 'Korisnik se uspješno registrirao' };
} ulov (pogreška) {
bacanjenoviGreška('Došlo je do greške prilikom registracije korisnika');
}
 }

asinkroni loginUser (korisničko ime: niz, lozinka: niz): Obećanje<niz> {
probati {
konst korisnik = čekatiovaj.userModel.findOne({ korisničko ime });
ako (!korisnik) {
bacanjenovi NotFoundException('Korisnik nije pronađen');
}
konst PasswordMatch = čekati bcrypt.compare (lozinka, korisnička.lozinka);
ako (!passwordMatch) {
bacanjenovi UnauthorizedException('Nevažeće vjerodajnice za prijavu');
}
konst nosivost = { userId: user._id };
konst token = ovaj.jwtService.sign (korisni teret);
povratak znak;
} ulov (pogreška) {
konzola.log (greška);
bacanjenovi UnauthorizedException('Došlo je do pogreške prilikom prijave');
}
}

asinkroni getUsers(): Obećanje {
probati {
konst korisnici = čekatiovaj.userModel.find({});
povratak korisnici;
} ulov (pogreška) {
ovaj.logger.error(`Došlo je do pogreške prilikom dohvaćanja korisnika: ${error.message}`);
bacanjenoviGreška('Došlo je do pogreške prilikom dohvaćanja korisnika');
}
}
}

The UserAuthService klasa implementira logiku registracije korisnika, prijave i dohvaćanja korisničkih podataka. Koristi se korisničkiModel za interakciju s bazom podataka i izvođenje potrebnih radnji uključujući raspršivanje lozinke tijekom registracija, provjera vjerodajnica za prijavu i na kraju, generiranje JWT tokena nakon uspješnog ovjera.

Implementacija Authentication Guarda

Kako bi se osigurala sigurnost osjetljivih resursa, ključno je pristup ograničiti isključivo na ovlaštene korisnike. To se postiže provođenjem sigurnosne mjere koja nalaže prisutnost važećeg JWT-a u narednim API zahtjevima upućenim zaštićenim krajnjim točkama, u ovom slučaju, korisnika ruta. u autorizacija korisnika imenik, stvorite novi auth.guard.ts datoteku i dodajte kod u nastavku.

uvoz { CanActivate, ExecutionContext, Injectable, UnauthorizedException } iz'@nestjs/common';
uvoz {JwtService} iz'@nestjs/jwt';
uvoz { Zahtjev } iz'izraziti';
uvoz { tajni ključ } iz'./config';

@Injekcioni()
izvozrazreda AuthGuard oruđa CanActivate {
konstruktor(privatna jwtService: JwtService) {}

asinkroni canActivate (kontekst: ExecutionContext): Obećanje<Booleov> {
konst zahtjev = context.switchToHttp().getRequest();
konst token = ovaj.extractTokenFromHeader (zahtjev);
ako (!token) {
bacanjenovi UnauthorizedException();
}
probati {
konst nosivost = čekatiovaj.jwtService.verifyAsync (token, {
tajna: tajniKljuč.tajna,
});
zahtjev['korisnik'] = nosivost;
} ulov {
bacanjenovi UnauthorizedException();
}
povratakpravi;
}
privatna extractTokenFromHeader (zahtjev: Zahtjev): niz | nedefiniran {
konst [tip, token] = request.headers.authorization?.split(' ')?? [];
povrataktip'Nositelj'? znak: nedefiniran;
}
}

Kod implementira a straža, kako je navedeno u službenoj dokumentaciji, kako bi zaštitili rute i osigurali da im mogu pristupiti samo autentificirani korisnici s valjanim JWT tokenom.

Izvlači JWT token iz zaglavlja zahtjeva, provjerava njegovu autentičnost pomoću JwtService, i dodjeljuje dekodirani korisni teret zahtjev['korisnik'] imovine za daljnju obradu. Ako token nedostaje ili je nevažeći, izbacuje UnauthorizedException spriječiti pristup zaštićenoj trasi.

Sada, stvarajte config.ts datoteku u istom direktoriju i dodajte kod ispod.

izvozkonst tajniKljuč = {
tajna: 'TAJNA VRIJEDNOST.',
};

Ovaj tajni ključ koristi se za potpisivanje i provjeru autentičnosti JWT-ova. Ključno je sigurno pohraniti vrijednost ključa kako bi se spriječio neovlašteni pristup i zaštitio integritet JWT-ova.

Definirajte API kontroler

Stvorite kontroler koji upravlja krajnjim točkama API-ja za autentifikaciju korisnika.

nest g kontroler korisnička autentifikacija

Zatim kopirajte kod koji je ovdje naveden Datoteka GitHub repozitorija, i dodajte ga u user-auth.controller.ts datoteka—definira krajnje točke za registraciju korisnika, prijavu i dohvaćanje korisničkih podataka. The UseGuards (AuthGuard) dekorater je uključen za provođenje provjere autentičnosti za getUsers endpoint, osiguravajući da samo autentificirani korisnici imaju pristup.

Ažurirajte datoteku user-auth.module.ts

Da biste odrazili promjene napravljene na projektu, ažurirajte korisnik-auth.module.ts datoteku za konfiguriranje potrebnih modula, usluga i kontrolera za autentifikaciju korisnika.

uvoz { Module, NestModule, MiddlewareConsumer } iz'@nestjs/common';
uvoz {JwtModule} iz'@nestjs/jwt';
uvoz { UserAuthController } iz'./user-auth.controller';
uvoz { UserAuthService } iz'./user-auth.service';
uvoz { MongooseModule } iz'@nestjs/mungos';
uvoz {Korisnička shema} iz'./schemas/user-auth.schema';
uvoz { tajni ključ } iz'./config';

@Modul({
uvozi: [
MongooseModule.forFeature([{ ime: 'Korisnik', shema: UserSchema }]),
JwtModule.register({
tajna: tajniKljuč.tajna,
signOptions: { expiresIn: '1h' },
}),
],
kontroleri: [UserAuthController],
pružatelji: [UserAuthService],
})

izvozrazreda UserAuthModule oruđa NestModule {
konfiguriraj (potrošač: MiddlewareConsumer) {
}
}

Na kraju, zavrtite razvojni poslužitelj i testirajte krajnje točke API-ja pomoću Postmana.

npm pokrenuti početak

Izrada sigurnih Nest.js REST API-ja

Izrada sigurnih Nest.js REST API-ja zahtijeva sveobuhvatan pristup koji nadilazi samo oslanjanje na JWT-ove za autentifikaciju i autorizaciju. Iako su JWT-ovi važni, jednako je važno implementirati dodatne sigurnosne mjere.

Dodatno, davanjem prioriteta sigurnosti u svakoj fazi razvoja API-ja, možete osigurati sigurnost svojih pozadinskih sustava.