Takip et

NestJS/MongoDB Uygulamaları İçin Hızlı Bir Kimlik Doğrulama Kütüphanesi Oluşturma

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


Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.