Güvenli ve verimli REST API'leri oluşturmak için Nest'in yapılandırılmış mimarisinden yararlanın.
Express.js, güvenli ve sağlam REST API'leri oluşturmak için harika bir teknolojidir, ancak önceden tanımlanmış bir yapı sağlamaz. Minimalist doğası, yönlendirme, kod organizasyonu ve güvenlik önlemleri gibi temel hususları manuel olarak veya mevcut ara yazılım ve kitaplıklardan yararlanarak halletmenize olanak tanır.
Buna karşılık, Express.js ve Node.js'nin üzerine inşa edilen Nest.js, daha yüksek düzeyde bir soyutlama sunar net bir yapı, sağlam bir kod organizasyonu yaklaşımı ve basitleştirilmiş uygulama sunan detaylar. Temelde Nest.js, verimli ve güvenli arka uç API'leri ve hizmetleri oluşturmak için daha yapılandırılmış bir mimari sağlar.
Nest.js Projesi Kurma
Başlamak için önce aşağıdaki komutu çalıştırarak Nest.js'nin komut satırını (CLI) global olarak kurmanız gerekir:
npm ben -g @nestjs/cli
Yükleme tamamlandıktan sonra devam edin ve aşağıdakileri çalıştırarak yeni bir proje oluşturun:
yuva yeni yuva-jwt-api
Ardından, Nest.js CLI, bağımlılıkları yüklemek için bir paket yöneticisi seçmenizi isteyecektir. Bu eğitim için kullanacağız npm, Düğüm Paket Yöneticisi. Seçme npm ve CLI temel bir Nest.js projesi oluşturup uygulamayı çalıştırmak için gerekli tüm yapılandırma dosyalarını ve başlangıç bağımlılıklarını yüklerken bekleyin.
Proje kurulduktan sonra, proje dizinine gidin ve geliştirme sunucusunu başlatın.
cd yuva-jwt-api
npm çalıştırma başlangıcı
Son olarak bu proje için kullanacağımız paketleri kurmak için aşağıdaki komutu çalıştırın.
npm kurulumu mongodb mongoose @nestjs/mongoose @types/bcrypt bcrypt jsonwebtoken @nestjs/jwt
Bu projenin kodunu burada bulabilirsiniz. GitHub deposu.
MongoDB Veritabanı Bağlantısını Yapılandırma
Yerel olarak bir MongoDB veritabanı kurun veya bulutta bir MongoDB kümesi yapılandırın. Veritabanını kurduktan sonra, veritabanı bağlantı URI dizesini kopyalayın, bir .env proje klasörümüzün kök dizinine dosya ve bağlantı dizesine yapıştırın:
MONGO_URI="bağlantı dizisi"
Ardından, güncelleyin app.module.ts içinde kaynak Mongoose'u aşağıdaki gibi yapılandırmak için dizin dosyası:
içe aktarmak { Modül } itibaren"@nestjs/ortak";
içe aktarmak { Yapılandırma Modülü } itibaren"@nestjs/config";
içe aktarmak { Firavun Faresi Modülü } itibaren"@nestjs/firavun faresi";
içe aktarmak {Uygulama Denetleyicisi} itibaren'./app.controller';
içe aktarmak { Uygulama Hizmeti } itibaren'./uygulama.hizmet';
içe aktarmak { UserAuthModule } itibaren'./user-auth/user-auth.module';@Modül({
ithalat: [
ConfigModule.forRoot({
envFilePath: '.env',
Global: doğru,
}),
MongooseModule.forRoot (işlem.env. MONGO_URI),
KullanıcıAuth Modülü,
],
denetleyiciler: [AppController],
sağlayıcılar: [AppService],
})
ihracatsınıf Uygulama Modülü {}
Sağlanan kod, Nest.js uygulaması için üç temel modülü yapılandırır: Yapılandırma Modülü ortam yapılandırması için, Firavun Faresi Modülü MongoDB bağlantısını kurmak için ve UserAuthModule kullanıcı kimlik doğrulaması için. Lütfen bu aşamada bir hata oluşabileceğini unutmayın, çünkü UserAuthModule henüz tanımlanmadı, ancak bir sonraki bölümde oluşturacağız.
Kullanıcı Kimlik Doğrulama Modülünü Oluşturma
Kodu temiz ve iyi organize edilmiş halde tutmak için aşağıdaki komutu çalıştırarak bir kullanıcı kimlik doğrulama modülü oluşturun.
yuva g modülü kullanıcı kimlik doğrulaması
Nest.js CLI aracı, gerekli modül dosyalarını otomatik olarak oluşturur. Ek olarak, app.module.ts kullanıcı kimlik doğrulama modülüyle ilgili gerekli değişiklikleri içeren dosya.
Ana proje yapılandırma dosyalarını manuel olarak oluşturmayı seçebilirsiniz, yine de CLI aracı basitleştirir değişiklikleri buna göre güncellemenin yanı sıra, gerekli öğeleri otomatik olarak oluşturarak bu süreci the app.module.ts dosya.
Bir Kullanıcı Şeması Oluşturun
Yeni oluşturulan içinde kullanıcı yetkilendirmesi içindeki klasör kaynak dizin, yeni bir tane oluştur şemalar/user-auth.schema.ts dosya için bir Mongoose şeması oluşturmak üzere aşağıdaki kodu ekleyin ve kullanıcı modeli
içe aktarmak { Prop, Şema, SchemaFactory } itibaren"@nestjs/firavun faresi";
içe aktarmak { Belge } itibaren'firavun faresi';@Şema({ zaman damgaları: doğru })
ihracatsınıf Kullanıcı {
@Prop()
Kullanıcı adı: sicim;
@Prop()
şifre: sicim;
}
ihracattip UserDocument = Kullanıcı ve Belge;
ihracatsabit UserSchema = SchemaFactory.createForClass (Kullanıcı);
Kullanıcı Kimlik Doğrulama Hizmetini Oluşturma
Şimdi aşağıdaki komutu çalıştırarak REST API için kimlik doğrulama mantığını yönetecek kullanıcı kimlik doğrulama hizmetini oluşturalım:
yuva g hizmeti kullanıcı kimlik doğrulaması
Bu komut bir oluşturacak user-auth.service.ts user-auth dizini içindeki dosya. Bu dosyayı açın ve aşağıdaki kodla güncelleyin.
- Öncelikle aşağıdaki importları yapın.
içe aktarmak { Enjekte edilebilir, NotFoundException, Logger, UnauthorizedException } itibaren"@nestjs/ortak";
içe aktarmak { Enjeksiyon Modeli } itibaren"@nestjs/firavun faresi";
içe aktarmak { Modeli } itibaren'firavun faresi';
içe aktarmak { Kullanıcı } itibaren'./schemas/user-auth.schema';
içe aktarmak * gibi şifrelemek itibaren'şifreleme';
içe aktarmak { Jwt Hizmeti } itibaren"@nestjs/jwt"; - Ardından, bir Kullanıcı Kimlik Doğrulama Hizmeti kullanıcı kaydı, oturum açma ve tüm kullanıcı veri yollarının alınması işlevlerini kapsayan sınıf.
@enjekte edilebilir()
ihracatsınıf Kullanıcı Kimlik Doğrulama Hizmeti {
özel salt okunur kaydedici = yeni Kaydedici (UserAuthService.name);
inşaatçı(@InjectModel(Kullanıcı adı) özel kullanıcıModel: Model, özel jwtService: JwtService ) {}
zaman uyumsuz registerUser (kullanıcı adı: sicim, şifre: sicim): Sözsicim }> {
denemek {
sabit karma = beklemek bcrypt.hash (şifre, 10);
beklemekBu.userModel.create({ kullanıcı adı, şifre: hash });
geri dönmek { İleti: "Kullanıcı başarıyla kaydedildi" };
} yakalamak (hata) {
fırlatmakyeniHata("Kullanıcı kaydedilirken bir hata oluştu");
}
}zaman uyumsuz loginUser (kullanıcı adı: sicim, şifre: sicim): Söz<sicim> {
denemek {
sabit kullanıcı = beklemekBu.userModel.findOne({ kullanıcı adı });
eğer (!kullanıcı) {
fırlatmakyeni Bulunamadıİstisna('Kullanıcı bulunamadı');
}
sabit şifreEşit = beklemek bcrypt.compare (şifre, kullanıcı.şifre);
eğer (!passwordMatch) {
fırlatmakyeni Yetkisizİstisna('Geçersiz giriş bilgileri');
}
sabit yük = { userId: user._id };
sabit jeton = Bu.jwtService.sign (yük);
geri dönmek jeton;
} yakalamak (hata) {
konsol.log (hata);
fırlatmakyeni Yetkisizİstisna('Giriş yapılırken bir hata oluştu');
}
}
zaman uyumsuz getUsers(): Söz
{
denemek {
sabit kullanıcılar = beklemekBu.userModel.find({});
geri dönmek kullanıcılar;
} yakalamak (hata) {
Bu.logger.hata(`Kullanıcılar alınırken bir hata oluştu: ${hata.mesaj}`);
fırlatmakyeniHata("Kullanıcılar alınırken bir hata oluştu");
}
}
}
bu Kullanıcı Kimlik Doğrulama Hizmeti class, kullanıcı kaydı, oturum açma ve kullanıcı verilerini alma mantığını uygular. Bu kullanır kullanıcıModel veritabanı ile etkileşime geçmek ve sırasında parolayı karma dahil olmak üzere gerekli eylemleri gerçekleştirmek için kayıt, oturum açma kimlik bilgilerini doğrulama ve son olarak, başarılı olduktan sonra JWT belirteçleri oluşturma kimlik doğrulama.
Kimlik Doğrulama Korumasını Uygulama
Hassas kaynakların güvenliğini sağlamak için erişimi yalnızca yetkili kullanıcılarla sınırlamak çok önemlidir. Bu, korumalı uç noktalara yapılan müteakip API taleplerinde geçerli bir JWT'nin varlığını zorunlu kılan bir güvenlik önlemi uygulanarak elde edilir; bu durumda, kullanıcılar rota. İçinde kullanıcı yetkilendirmesi dizin, yeni bir tane oluştur auth.guard.ts dosyasını açın ve aşağıdaki kodu ekleyin.
içe aktarmak { CanActivate, ExecutionContext, Enjekte edilebilir, Yetkisiz İstisna } itibaren"@nestjs/ortak";
içe aktarmak { Jwt Hizmeti } itibaren"@nestjs/jwt";
içe aktarmak { Rica etmek } itibaren'ifade etmek';
içe aktarmak { gizli anahtar } itibaren'./config';@enjekte edilebilir()
ihracatsınıf Doğrulama Koruması uygular Etkinleştir {
inşaatçı(özel jwtService: JwtService) {}
zaman uyumsuz canActivate (bağlam: ExecutionContext): Söz<mantıksal> {
sabit istek = bağlam.switchToHttp().getRequest();
sabit jeton = Bu.extractTokenFromHeader (istek);
eğer (!jeton) {
fırlatmakyeni Yetkisizİstisna();
}
denemek {
sabit yük = beklemekBu.jwtService.verifyAsync (belirteç, {
sır: secretKey.secret,
});
rica etmek["kullanıcı"] = yük;
} yakalamak {
fırlatmakyeni Yetkisizİstisna();
}
geri dönmekdoğru;
}
özel extractTokenFromHeader (istek: İstek): sicim | Tanımsız {
sabit [tip, belirteç] = request.headers.yetkilendirme?.split(' ')?? [];
geri dönmektip'Taşıyıcı'? jeton: Tanımsız;
}
}
Kod bir uygular koruma, resmi belgelerde belirtildiği gibi, rotaları korumak ve yalnızca geçerli bir JWT belirtecine sahip kimliği doğrulanmış kullanıcıların bunlara erişebilmesini sağlamak için.
JWT belirtecini istek başlığından çıkarır, orijinalliğini kullanarak doğrular. Jwt Hizmeti, ve kodu çözülmüş yükü istek['kullanıcı'] daha fazla işlem için özellik. Belirteç eksik veya geçersizse, bir Yetkisiz İstisna korumalı rotaya erişimi engellemek için.
Şimdi, oluştur yapılandırma.ts dosyasını aynı dizine kopyalayın ve aşağıdaki kodu ekleyin.
ihracatsabit gizliAnahtar = {
gizli: "GİZLİ DEĞER.",
};
Bu gizli anahtar, JWT'lerin orijinalliğini imzalamak ve doğrulamak için kullanılır. Yetkisiz erişimi önlemek ve JWT'lerin bütünlüğünü korumak için anahtar değerini güvenli bir şekilde saklamak çok önemlidir.
API Denetleyicisini tanımlayın
Kullanıcı kimlik doğrulaması için API uç noktalarını işleyen bir denetleyici oluşturun.
yuva g denetleyicisi kullanıcı yetkilendirmesi
Ardından, burada sağlanan kodu kopyalayın GitHub depo dosyasıve şuraya ekleyin: user-auth.controller.ts dosya—kullanıcı kaydı, oturum açma ve kullanıcı verilerinin alınması için uç noktaları tanımlar. bu Kullanım Korumaları (AuthGuard) kimlik doğrulamasını zorlamak için dekoratör dahil edilmiştir. Kullanıcıları al uç nokta, yalnızca kimliği doğrulanmış kullanıcılara erişim verilmesinin sağlanması.
user-auth.module.ts Dosyasını Güncelleyin
Projede yapılan değişiklikleri yansıtmak için user-auth.module.ts kullanıcı kimlik doğrulaması için gerekli modülleri, hizmetleri ve denetleyicileri yapılandırmak için dosya.
içe aktarmak { Modül, NestModule, MiddlewareConsumer } itibaren"@nestjs/ortak";
içe aktarmak { JwtModule } itibaren"@nestjs/jwt";
içe aktarmak { UserAuthController } itibaren'./user-auth.controller';
içe aktarmak { UserAuthService } itibaren'./user-auth.service';
içe aktarmak { Firavun Faresi Modülü } itibaren"@nestjs/firavun faresi";
içe aktarmak { Kullanıcı Şeması } itibaren'./schemas/user-auth.schema';
içe aktarmak { gizli anahtar } itibaren'./config';@Modül({
ithalat: [
MongooseModule.forFeature([{ ad: "Kullanıcı", şema: UserSchema }]),
JwtModule.register({
sır: secretKey.secret,
signOptions: { kullanım süresi: "1sa" },
}),
],
denetleyiciler: [UserAuthController],
sağlayıcılar: [UserAuthService],
})
ihracatsınıf UserAuthModule uygular Yuva Modülü {
yapılandır (tüketici: MiddlewareConsumer) {
}
}
Son olarak, geliştirme sunucusunu çalıştırın ve Postman'ı kullanarak API uç noktalarını test edin.
npm çalıştırma başlangıcı
Güvenli Nest.js REST API'leri Oluşturma
Güvenli Nest.js REST API'leri oluşturmak, kimlik doğrulama ve yetkilendirme için yalnızca JWT'lere güvenmenin ötesine geçen kapsamlı bir yaklaşım gerektirir. JWT'ler önemli olmakla birlikte, ek güvenlik önlemlerinin uygulanması da aynı derecede önemlidir.
Ayrıca API geliştirmenin her aşamasında güvenliğe öncelik vererek arka uç sistemlerinizin güvenliğini sağlayabilirsiniz.