NestJS/MongoDB Uygulamaları İçin Hızlı Bir Kimlik Doğrulama Kütüphanesi Oluşturma
Merhaba! Bu makalede, NestJS ve MongoDB kullanarak hızlı ve güvenilir bir kimlik doğrulama kütüphanesi nasıl oluşturabileceğinizi adım adım göstereceğim. Bu, özellikle yeni başlayanlar için yararlı bir kılavuz olacaktır. Öncelikle, gerekli paketleri kuracağız. Ardından, kullanıcı modelini, servislerini ve kontrolörlerini oluşturacağız. Son olarak da, JWT (JSON Web Token) kullanarak güvenli bir şekilde kimlik doğrulaması gerçekleştireceğiz.
Gerekli Paketlerin Kurulumu
Başlamadan önce, projenize aşağıdaki paketleri kurmanız gerekmektedir:
npm install @nestjs/jwt passport passport-local mongoose
Bu paketler, JWT token oluşturma, Passport.js ile kimlik doğrulama stratejileri oluşturma ve MongoDB ile etkileşim kurma için gereklidir. Passport.js, farklı kimlik doğrulama stratejilerini kolayca entegre etmenizi sağlar. Mongoose ise MongoDB ile etkileşim kurmayı kolaylaştıran bir ORM (Object-Relational Mapper)’dır.
Kullanıcı Modelinin Oluşturulması
İlk adım olarak, MongoDB’de kullanıcı bilgilerini saklamak için bir model oluşturmalıyız. Bu model, kullanıcı adı, şifre ve diğer gerekli bilgileri içerecektir. Aşağıda örnek bir kullanıcı modeli bulunmaktadır:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
export type UserDocument = User & Document;
@Schema()
export class User {
@Prop()
username: string;
@Prop()
password: string;
// Diğer özellikler eklenebilir...
}
export const UserSchema = SchemaFactory.createForClass(User);
Bu model, kullanıcı adı ve şifre alanlarını içerir. İhtiyaçlarınıza göre diğer alanları da ekleyebilirsiniz. Şifreleme için bcrypt gibi bir kütüphane kullanmanız önerilir. Bu güvenli bir şekilde şifreleri saklamanıza yardımcı olur.
Kullanıcı Servisi
Kullanıcı servisinde, kullanıcı kayıt ve giriş işlemlerini yöneteceğiz. Burada, kullanıcı modelini kullanarak veri tabanıyla etkileşime gireceğiz.
// ... (importlar)
@Injectable()
export class UserService {
constructor(@InjectModel(User.name) private userModel: Model) {}
async create(user: User) {
const createdUser = new this.userModel(user);
return createdUser.save();
}
async findOne(username: string): Promise {
return this.userModel.findOne({ username });
}
}
Bu servis, kullanıcı oluşturma ve var olan bir kullanıcıyı bulma metodlarını içerir. @InjectModel decorator’ı, mongoose modelini enjekte eder.
Kimlik Doğrulama Stratejisi (Passport.js)
Passport.js kullanarak Local Strategy ile kimlik doğrulama stratejimizi oluşturalım. Bu strateji, kullanıcı adı ve şifre kullanarak kimlik doğrulamasını gerçekleştirir.
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { UserService } from './user.service';
import { compare } from 'bcrypt'; // Şifre karşılaştırma için bcrypt kullanın
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private userService: UserService) {
super();
}
async validate(username: string, password: string): Promise {
const user = await this.userService.findOne(username);
if (!user) {
throw new UnauthorizedException();
}
const isMatch = await compare(password, user.password); // Bcrypt ile şifre karşılaştırma
if (!isMatch) {
throw new UnauthorizedException();
}
return user;
}
}
JWT (JSON Web Token) Kullanımı
Kullanıcı başarılı bir şekilde giriş yaptıktan sonra, bir JWT tokenı oluşturup kullanıcıya göndereceğiz. Bu token, sonraki isteklerde kimlik doğrulaması için kullanılacaktır. NestJS’in JWT modülünü kullanarak token oluşturmak oldukça kolaydır.
// ... (importlar)
@Injectable()
export class AuthService {
constructor(
private userService: UserService,
private jwtService: JwtService,
) {}
async validateUser(username: string, pass: string): Promise {
const user = await this.userService.findOne(username);
if (user && (await compare(pass, user.password))) {
return user;
}
return null;
}
async login(user: any) {
const payload = { username: user.username, sub: user._id };
return {
access_token: this.jwtService.sign(payload),
};
}
}
Bu servis, kullanıcıyı doğruladıktan sonra JWT token’ını oluşturur. jwtService.sign() metodu, JWT token’ını oluşturmak için kullanılır. payload objesi, token’da taşınacak bilgileri içerir.
Auth Guard
Güvenlik için, korunan rotaları korumak amacıyla bir Auth Guard kullanmanız gerekir. Bu guard, gelen isteklerin JWT token’ını doğrulayarak yetkisiz erişimi engeller.
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(
context: ExecutionContext,
): boolean | Promise | Observable {
const request = context.switchToHttp().getRequest();
const token = request.headers.authorization.split(' ')[1];
try {
const payload = this.jwtService.verify(token);
request['user'] = payload;
return true;
} catch (error) {
return false;
}
}
}
Bu guard, Authorization header’ındaki token’ı doğrular ve doğruysa isteği devam ettirir. Aksi takdirde, yetkisiz erişim hatası döndürülür.
Sonuç
Bu makalede, NestJS ve MongoDB kullanarak basit bir kimlik doğrulama kütüphanesi nasıl oluşturulacağını gösterdim. Bu, daha karmaşık sistemler için temel bir yapı taşı görevi görür. Unutmayın ki, gerçek dünya uygulamalarında daha gelişmiş güvenlik önlemleri alınmalıdır. Daha fazla bilgi için fatihsoysal.com sitesini ziyaret edebilirsiniz. Ayrıca, bu makaleyi yazarken başvurduğum kaynağı da inceleyebilirsiniz. Bu bilgilerle güvenli ve sağlam bir kimlik doğrulama sistemini oluşturabilirsiniz. İyi kodlamalar!
#Etiketler: nestjs, mongodb, kimlik doğrulama, authentication, güvenlik, nodejs, typescript, jwt, passport, mongoose, bcrypt, auth guard, local strategy, json web token
