Használja ki a Nest strukturált architektúráját biztonságos és hatékony REST API-k létrehozásához.
Az Express.js nagyszerű technológia a biztonságos és robusztus REST API-k létrehozásához, azonban nem biztosít előre meghatározott struktúrát. Minimalista jellege lehetővé teszi az olyan alapvető szempontok kezelését, mint az útválasztás, a kódszervezés és a biztonsági intézkedések, akár manuálisan, akár a rendelkezésre álló köztes szoftverek és könyvtárak kihasználásával.
Ezzel szemben az Express.js-re és a Node.js-re épülő Nest.js magasabb szintű absztrakciót vezet be amely világos struktúrát, robusztus kódszervezési megközelítést és egyszerűsített megvalósítást kínál részletek. A Nest.js lényegében strukturáltabb architektúrát biztosít a hatékony és biztonságos háttér API-k és szolgáltatások létrehozásához.
Nest.js projekt beállítása
A kezdéshez először telepítenie kell a Nest.js parancssorát (CLI) globálisan az alábbi parancs futtatásával:
npm i -g @nestjs/cli
Ha a telepítés befejeződött, folytassa és hozzon létre egy új projektet a következő futtatásával:
nest new nest-jwt-api
Ezután a Nest.js parancssori felület felkéri, hogy válasszon csomagkezelőt a függőségek telepítéséhez. Ehhez az oktatóanyaghoz használjuk npm, a Node Package Manager. Válassza ki npm és várja meg, amíg a parancssori felület létrehoz egy alap Nest.js projektet, és telepíti az alkalmazás futtatásához szükséges összes konfigurációs fájlt és kezdeti függőséget.
A projekt beállítása után lépjen a projektkönyvtárba, és indítsa el a fejlesztői kiszolgálót.
cd nest-jwt-api
npm futás indítása
Végül futtassa az alábbi parancsot a projekthez használt csomagok telepítéséhez.
npm mongodb mongoose @nestjs/mongoose @types/bcrypt bcrypt jsonwebtoken @nestjs/jwt telepítése
A projekt kódját itt találja meg GitHub adattár.
Konfigurálja a MongoDB adatbázis-kapcsolatot
Állítson be egy MongoDB adatbázist helyileg vagy konfiguráljon egy MongoDB-fürtöt a felhőben. Az adatbázis beállítása után másolja ki az adatbázis-kapcsolat URI karakterláncát, hozzon létre a .env fájlt a projektmappánk gyökérkönyvtárába, és illessze be a kapcsolati karakterláncba:
MONGO_URI="kapcsolati karakterlánc"
Ezután frissítse a app.module.ts ban,-ben src könyvtárfájl a Mongoose konfigurálásához az alábbiak szerint:
import { Modul } tól től"@nestjs/common";
import { ConfigModule } tól től"@nestjs/config";
import { MongooseModule } tól től"@nestjs/mongoose";
import { AppController } tól től"./app.controller";
import { AppService } tól től"./app.service";
import { UserAuthModule } tól től'./user-auth/user-auth.module';@Modul({
import: [
ConfigModule.forRoot({
envFilePath: ".env",
isGlobal: igaz,
}),
MongooseModule.forRoot (process.env. MONGO_URI),
UserAuthModule,
],
vezérlők: [AppController],
szolgáltatók: [AppService],
})
exportosztály AppModule {}
A mellékelt kód három alapvető modult konfigurál a Nest.js alkalmazáshoz: ConfigModule a környezet konfigurálásához, MongooseModule a MongoDB kapcsolat létrehozásához, és UserAuthModule felhasználói hitelesítéshez. Kérjük, vegye figyelembe, hogy ebben a szakaszban hiba léphet fel, mivel a UserAuthModule még nincs meghatározva, de a következő részben létrehozzuk.
Felhasználói hitelesítési modul létrehozása
A tiszta és jól szervezett kód fenntartásához hozzon létre egy felhasználói hitelesítési modult a következő parancs futtatásával.
nest g module user-ath
A Nest.js CLI eszköz automatikusan előállítja a szükséges modulfájlokat. Ezenkívül frissíti a app.module.ts fájl, amely tartalmazza a felhasználói hitelesítési modulhoz kapcsolódó szükséges változtatásokat.
Dönthet úgy, hogy a fő projekt konfigurációs fájlokat manuálisan hozza létre, ennek ellenére a CLI eszköz leegyszerűsíti ezt a folyamatot a szükséges elemek automatikus létrehozásával, valamint a módosítások megfelelő frissítésével a app.module.ts fájlt.
Hozzon létre egy felhasználói sémát
Belül az újonnan létrehozott user-auth mappában a src könyvtárat, hozzon létre egy újat schemas/user-auth.schema.ts fájlt, és adja hozzá a következő kódot a Mongoose séma létrehozásához a Felhasználó modell
import { Prop, Schema, SchemaFactory } tól től"@nestjs/mongoose";
import { Dokumentum } tól től'indiai menyét';@Séma({ időbélyegek: igaz })
exportosztály felhasználó {
@Támaszt()
felhasználónév: húr;
@Támaszt()
Jelszó: húr;
}
exporttípus UserDocument = Felhasználó és dokumentum;
exportconst UserSchema = SchemaFactory.createForClass (Felhasználó);
Felhasználói hitelesítési szolgáltatás létrehozása
Most hozzuk létre a felhasználói hitelesítési szolgáltatást, amely kezeli a REST API hitelesítési logikáját az alábbi parancs futtatásával:
nest g service user-auth
Ez a parancs létrehozza a user-auth.service.ts fájlt a user-ath könyvtárban. Nyissa meg ezt a fájlt, és frissítse a következő kóddal.
- Először hajtsa végre a következő importálást.
import { Injektálható, NotFoundException, Logger, UnauthorizedException } tól től"@nestjs/common";
import { InjectModel } tól től"@nestjs/mongoose";
import { Modell } tól től'indiai menyét';
import { Felhasználó } tól től'./schemas/user-auth.schema';
import * mint bcrypt tól től"titkos";
import { JwtService } tól től"@nestjs/jwt"; - Ezután hozzon létre a UserAuthService osztály, amely magában foglalja a felhasználói regisztráció, bejelentkezés és az összes felhasználói adatút lekérésének funkcionalitását.
@Injektálható()
exportosztály UserAuthService {
magán csak olvasható logger = új Logger (UserAuthService.name);
konstruktőr(@InjectModel(Felhasználónév) magán userModel: Modell, magán jwtService: JwtService ) {}
async registerUser (felhasználónév: húr, Jelszó: húr): Ígérethúr }> {
próbáld ki {
const hash = várja bcrypt.hash (jelszó, 10);
várjaez.userModel.create({ felhasználónév, jelszó: hash });
Visszatérés { üzenet: "Felhasználó sikeresen regisztrálva" };
} fogás (hiba) {
dobásújHiba("Hiba történt a felhasználó regisztrálásakor");
}
}async loginUser (felhasználónév: húr, Jelszó: húr): Ígéret<húr> {
próbáld ki {
const felhasználó = várjaez.userModel.findOne({ felhasználónév });
ha (!felhasználó) {
dobásúj NotFoundException('Felhasználó nem található');
}
const passwordMatch = várja bcrypt.compare (jelszó, user.password);
ha (!passwordMatch) {
dobásúj Nem engedélyezett kivétel("Érvénytelen bejelentkezési adatok");
}
const payload = { userId: user._id };
const token = ez.jwtService.sign (hasznos teher);
Visszatérés jelképes;
} fogás (hiba) {
konzol.log (hiba);
dobásúj Nem engedélyezett kivétel("Hiba történt a bejelentkezés során");
}
}
async getUsers(): Ígéret
{
próbáld ki {
const felhasználók = várjaez.userModel.find({});
Visszatérés felhasználók;
} fogás (hiba) {
ez.logger.error(`Hiba történt a felhasználók lekérése közben: ${error.message}`);
dobásújHiba("Hiba történt a felhasználók lekérése közben");
}
}
}
A UserAuthService osztály valósítja meg a felhasználói regisztráció, a bejelentkezés és a felhasználói adatok lekérésének logikáját. Használja a userModel az adatbázissal való interakcióhoz és a szükséges műveletek végrehajtásához, beleértve a jelszó kivonatolását is regisztráció, bejelentkezési hitelesítő adatok ellenőrzése, és végül a sikeres JWT tokenek generálása hitelesítés.
Az Authentication Guard megvalósítása
Az érzékeny erőforrások biztonságának biztosítása érdekében kulcsfontosságú, hogy a hozzáférést kizárólag a jogosult felhasználókra korlátozzuk. Ez egy olyan biztonsági intézkedés végrehajtásával érhető el, amely előírja egy érvényes JWT jelenlétét a védett végpontokhoz intézett későbbi API-kérésekben, ebben az esetben a felhasználókat útvonal. Ban,-ben user-auth könyvtárat, hozzon létre egy újat auth.guard.ts fájlt, és adja hozzá az alábbi kódot.
import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } tól től"@nestjs/common";
import { JwtService } tól től"@nestjs/jwt";
import { Kérés } tól től'Expressz';
import { titkos kulcs } tól től'./config';@Injektálható()
exportosztály AuthGuard megvalósítja CanActivate {
konstruktőr(magán jwtService: JwtService) {}
async canActivate (kontextus: ExecutionContext): Ígéret<logikai érték> {
const request = context.switchToHttp().getRequest();
const token = ez.extractTokenFromHeader (kérés);
ha (!token) {
dobásúj UnauthorizedException();
}
próbáld ki {
const hasznos teher = várjaez.jwtService.verifyAsync (token, {
titok: secretKey.secret,
});
kérés["felhasználó"] = hasznos teher;
} fogás {
dobásúj UnauthorizedException();
}
Visszatérésigaz;
}
magán extractTokenFromHeader (kérés: Request): húr | határozatlan {
const [típus, token] = request.headers.authorization?.split(' ')?? [];
Visszatéréstípus'Vivő'? jelképes: határozatlan;
}
}
A kód megvalósítja a őr, a hivatalos dokumentációban meghatározottak szerint az útvonalak védelme és annak biztosítása, hogy csak hitelesített, érvényes JWT tokennel rendelkező felhasználók férhessenek hozzájuk.
Kibontja a JWT tokent a kérés fejlécéből, és a segítségével ellenőrzi annak hitelességét JwtService, és hozzárendeli a dekódolt hasznos terhelést a kérés['felhasználó'] ingatlan további feldolgozásra. Ha a token hiányzik vagy érvénytelen, akkor egy jelet dob Jogosulatlan kivétel hogy megakadályozzák a védett útvonalhoz való hozzáférést.
Most pedig alkoss config.ts fájlt ugyanabban a könyvtárban, és adja hozzá az alábbi kódot.
exportconst titkos kulcs = {
titok: "TITKOS ÉRTÉK.",
};
Ez a titkos kulcs a JWT-k aláírására és hitelességének ellenőrzésére szolgál. Alapvető fontosságú a kulcsérték biztonságos tárolása az illetéktelen hozzáférés megakadályozása és a JWT-k integritásának védelme érdekében.
Határozza meg az API-vezérlőt
Hozzon létre egy vezérlőt, amely kezeli az API-végpontokat a felhasználói hitelesítéshez.
nest g controller user-ath
Ezután másolja ki az itt megadott kódot GitHub adattárfájl, és add hozzá a user-auth.controller.ts fájl – ez határozza meg a felhasználói regisztráció, a bejelentkezés és a felhasználói adatok lekérésének végpontjait. A UseGuards (AuthGuard) lakberendező a hitelesítés kikényszerítéséhez getUsers végpont, biztosítva, hogy csak hitelesített felhasználók kapjanak hozzáférést.
Frissítse a user-auth.module.ts fájlt
A projekten végrehajtott módosítások tükrözéséhez frissítse a user-auth.module.ts fájlt a felhasználói hitelesítéshez szükséges modulok, szolgáltatások és vezérlők konfigurálásához.
import { Modul, NestModule, MiddlewareConsumer } tól től"@nestjs/common";
import { JwtModule } tól től"@nestjs/jwt";
import { UserAuthController } tól től'./user-auth.controller';
import { UserAuthService } tól től"./user-auth.service";
import { MongooseModule } tól től"@nestjs/mongoose";
import { UserSchema } tól től'./schemas/user-auth.schema';
import { titkos kulcs } tól től'./config';@Modul({
import: [
MongooseModule.forFeature([{ név: "Felhasználó", séma: UserSchema }]),
JwtModule.register({
titok: secretKey.secret,
signOptions: { expiresIn: "1h" },
}),
],
vezérlők: [UserAuthController],
szolgáltatók: [UserAuthService],
})
exportosztály UserAuthModule megvalósítja NestModule {
konfigurálás (fogyasztó: MiddlewareConsumer) {
}
}
Végül forgassa fel a fejlesztőkiszolgálót, és tesztelje az API-végpontokat a Postman segítségével.
npm futás indítása
Biztonságos Nest.js REST API-k létrehozása
A biztonságos Nest.js REST API-k létrehozásához olyan átfogó megközelítésre van szükség, amely túlmutat a JWT-k hitelesítésén és engedélyezésén. Bár a JWT-k fontosak, ugyanolyan fontos a további biztonsági intézkedések végrehajtása.
Ezen túlmenően, ha az API-fejlesztés minden szakaszában előnyben részesíti a biztonságot, biztosíthatja háttérrendszerei biztonságát.