NestJS Blog’da Kullanıcı Sistemi: Adım Adım Rehber
Bir blog platformu geliştirmek istiyorsunuz ama kullanıcı kayıt, giriş ve yetkilendirme gibi temel fonksiyonları nasıl entegre edeceğinizi bilmiyor musunuz? Bu makale, NestJS framework’ünü kullanarak adım adım bir kullanıcı sistemi oluşturmanıza yardımcı olacak. Güvenli ve ölçeklenebilir bir blog için ihtiyaç duyduğunuz tüm adımları, örnek kodlarla birlikte detaylı bir şekilde ele alacağız. Bu rehber, hem yeni başlayanlar hem de deneyimli geliştiriciler için faydalı olacaktır.
Öğrenme Yol Haritası
- Yeni Başlayan: Temel NestJS kavramları ve proje kurulumu.
- Orta Seviye: Kullanıcı modelinin oluşturulması, veritabanı entegrasyonu ve güvenlik önlemleri.
- İleri Seviye: JWT (JSON Web Token) kullanımı, yetkilendirme ve rol tabanlı erişim kontrolü.
1. Temel Kavramlar: NestJS ve Kullanıcı Sistemleri
Öncelikle, NestJS’in ne olduğunu ve kullanıcı sistemlerinin temel bileşenlerini anlamak önemlidir. NestJS, Node.js üzerinde çalışan ve Angular’dan esinlenen bir backend framework’üdür. Modüler yapısı ve TypeScript desteği ile büyük ve karmaşık projelerde bile kolayca geliştirme yapmanızı sağlar. Bir kullanıcı sistemi ise, kullanıcıların bir platforma kayıt olmalarını, giriş yapmalarını, profillerini yönetmelerini ve farklı içeriklere erişimlerini kontrol etmeyi sağlayan bir sistemdir.
Kullanıcı sistemleri genellikle şu bileşenlerden oluşur: Kayıt (Registration), Giriş (Login), Oturum Açma (Session Management), Yetkilendirme (Authorization), Kimlik Doğrulama (Authentication). Bu bileşenler, güvenli ve verimli bir şekilde çalışacak şekilde tasarlanmalıdır. Örneğin, şifrelerin güvenli bir şekilde saklanması için hashing algoritmaları kullanılması gerekmektedir. Daha fazla bilgi için Fatih Soysal’ın bloguna göz atabilirsiniz.
Bu makalede, güvenli bir kullanıcı sistemi oluşturmak için TypeORM ve Passport.js gibi yaygın olarak kullanılan kütüphaneleri kullanacağız. TypeORM, veritabanı etkileşimini kolaylaştırırken, Passport.js farklı kimlik doğrulama stratejileri sunar. Bu kütüphaneleri projeye entegre etmenin detaylarını ilerleyen bölümlerde inceleyeceğiz.
2. Proje Kurulumu ve İlk Adımlar: NestJS ve TypeORM
İlk adım olarak, yeni bir NestJS projesi oluşturalım ve TypeORM’u entegre edelim. Bu işlem için aşağıdaki komutları kullanabilirsiniz:
npm install -g @nestjs/cli
nest new blog-app
cd blog-app
npm install typeorm @nestjs/typeorm
Ardından, ormconfig.json dosyasını oluşturarak veritabanı bağlantı bilgilerinizi belirtin. Örneğin, PostgreSQL kullanıyorsanız:
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "your_username",
"password": "your_password",
"database": "blog_db",
"entities": ["dist/**/*.entity{.ts,.js}"],
"synchronize": true
}
Dikkat: synchronize: true geliştirme ortamı için uygundur. Üretim ortamında bu ayarı false olarak değiştirmeyi ve göçler (migrations) kullanmayı unutmayın. Veritabanı bilgilerinizi güvenli bir şekilde yönetmek için ortam değişkenleri kullanmanız önerilir.
3. Kullanıcı Modelini Oluşturma ve Veritabanı İşlemleri
Kullanıcı modelini tanımlamak için bir entity oluşturalım. Bu entity, kullanıcıların ad, soyad, e-posta ve şifre gibi bilgilerini saklayacaktır.
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ unique: true })
email: string;
@Column()
password: string;
}
Bu modeli veritabanına yansıtmak için TypeORM'un @Entity() ve diğer dekoratörlerini kullanıyoruz. @Column() dekoratörü, her alan için veritabanı sütununu tanımlar. unique: true özelliği, e-posta adresinin benzersiz olmasını sağlar.
4. Kayıt ve Giriş İşlemlerinin Uygulanması: Passport.js ile Entegrasyon
Kullanıcı kayıt ve giriş işlemlerini gerçekleştirmek için Passport.js kütüphanesini kullanacağız. Passport.js, farklı kimlik doğrulama stratejileri sunar. Bu örnekte, Local Strategy'i kullanarak kullanıcı adı ve şifre ile giriş yapacağız.
// auth.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import * as bcrypt from 'bcrypt';
@Injectable()
export class AuthService {
constructor(@InjectRepository(User) private userRepository: Repository) {}
async register(user: User): Promise {
const hashedPassword = await bcrypt.hash(user.password, 10);
user.password = hashedPassword;
return this.userRepository.save(user);
}
async login(user: User): Promise {
// ... (Login işlemleri) ...
}
}
Bu örnekte, bcrypt kütüphanesi ile şifreleri güvenli bir şekilde hashliyoruz. register fonksiyonu, yeni bir kullanıcı kaydederken şifreyi hashleyerek veritabanına kaydeder. login fonksiyonunda ise, veritabanında bulunan kullanıcı ile girilen bilgileri karşılaştırıp doğrulama işlemini yapacağız.
5. JWT (JSON Web Token) ile Güvenli Oturum Yönetimi
JWT (JSON Web Token), kullanıcı kimlik bilgilerini güvenli bir şekilde taşımak için kullanılan bir standarttır. JWT kullanarak, kullanıcı giriş yaptıktan sonra bir token üretip, sonraki isteklerde bu token'ı kullanarak kimlik doğrulama işlemini gerçekleştirebiliriz. NestJS, JWT kullanımını kolaylaştıran paketler sunar.
// auth.service.ts (JWT eklendi)
// ... (diğer kodlar) ...
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(
@InjectRepository(User) private userRepository: Repository,
private jwtService: JwtService,
) {}
async login(user: User): Promise<{ accessToken: string }> {
const payload = { sub: user.id, username: user.email };
const accessToken = await this.jwtService.sign(payload);
return { accessToken };
}
}
Bu örnekte, jwtService.sign() fonksiyonu ile bir JWT token'ı üretiyoruz. Bu token, kullanıcı bilgilerini içerir ve isteklere eklenerek kimlik doğrulaması sağlanır.
6. Yetkilendirme (Authorization) ve Rol Tabanlı Erişim Kontrolü
Kullanıcıların yalnızca yetkili oldukları kaynaklara erişebilmelerini sağlamak için yetkilendirme mekanizmaları kullanmalıyız. Rol tabanlı erişim kontrolü (RBAC), farklı kullanıcılara farklı yetkiler atamamıza olanak tanır. Örneğin, yönetici kullanıcılarının tüm içerikleri düzenleme yetkisine sahip olmasını, normal kullanıcıların ise yalnızca kendi içeriklerini düzenleyebilmelerini sağlayabiliriz.
Bu, NestJS'in Guard mekanizması ve rol tabanlı yetkilendirme kütüphaneleri ile gerçekleştirilebilir. Her rota için ayrı ayrı yetkilendirme kuralları tanımlayarak istediğiniz erişim seviyesini sağlayabilirsiniz. Örneğin, sadece yönetici kullanıcılarının erişebileceği bir rota için bir Guard oluşturabilirsiniz.
7. Güvenlik Uyarıları ve En İyi Uygulamalar
Bir kullanıcı sistemi oluştururken güvenlik en önemli konulardan biridir. Şifreleri güvenli bir şekilde saklamak, SQL enjeksiyonuna karşı önlem almak, XSS (Cross-Site Scripting) saldırılarını engellemek ve diğer güvenlik açıklarını kapatmak son derece önemlidir. Bu konuda daha fazla bilgi için OWASP (Open Web Application Security Project) kaynaklarına başvurabilirsiniz.
Dikkat!
Şifreleri düz metin olarak saklamayın. Her zaman güvenli hashing algoritmaları kullanın (örneğin, bcrypt).
Ayrıca, kullanıcı girdilerini doğrulamak ve doğrulama işlemlerini düzenli aralıklarla güncellemek de güvenlik için önemlidir. Düzenli güvenlik denetimleri yaparak potansiyel güvenlik açıklarını tespit edebilirsiniz. Her zaman güncel güvenlik açıklarını takip edin ve bunlara karşı gerekli önlemleri alın.
8. Performans Karşılaştırmaları ve Optimizasyon
Kullanıcı sisteminin performansı, özellikle yüksek trafikli bloglarda son derece önemlidir. Veritabanı sorgularını optimize etmek, önbelleğe alma mekanizmaları kullanmak ve gerekli olmayan işlemleri azaltmak performansı artırmak için önemli adımlardır.
| Yöntem | Performans | Açıklama |
|---|---|---|
| Veritabanı Optimizasyonu | Yüksek | İndeksler, sorguların optimize edilmesi |
| Önbelleğe Alma | Orta | Redis veya Memcached gibi önbellek sistemleri |
| Asenkron İşlemler | Orta | Asenkron işlemler ile performansı arttırmak |
Sonuç
Bu makalede, NestJS kullanarak adım adım bir kullanıcı sistemi oluşturmayı öğrendiniz. JWT ile güvenli oturum yönetimi, yetkilendirme ve performans optimizasyonu gibi konuları ele alarak, güvenli ve ölçeklenebilir bir blog platformu geliştirmeniz için gereken temel adımları gösterdik. Daha fazla bilgi ve ileri düzey teknikler için Fatih Soysal'ın bloguna göz atabilirsiniz.
Sıkça Sorulan Sorular
- JWT'ler ne kadar süre geçerli olmalıdır? JWT'lerin geçerlilik süresi, uygulamanızın güvenlik gereksinimlerine bağlıdır. Kısa süreli tokenler daha güvenlidir, ancak sık sık yenilenmeleri gerekir.
- Şifreleri nasıl güvenli bir şekilde saklamalıyım? Her zaman güvenli hashing algoritmaları (örneğin, bcrypt) kullanın ve şifreleri düz metin olarak saklamayın.
- Rol tabanlı erişim kontrolünü nasıl uygulayabilirim? NestJS'in Guard mekanizması ve rol tabanlı yetkilendirme kütüphaneleri kullanılabilir.
- Veritabanı bağlantısını nasıl yapılandırmalıyım?
ormconfig.jsondosyasında veritabanı bağlantı bilgilerinizi belirtmeniz gerekir. - Kullanıcı kayıt işlemi nasıl yapılır? Kullanıcı kayıt işlemi için
AuthService'de bir register metodu oluşturmalı ve şifreyi hashleyerek veritabanına kaydetmelisiniz.
Yazar: Fatih Soysal