Bu proje, Express.js kullanılarak geliştirilmiş kapsamlı bir kimlik doğrulama ve yetkilendirme sistemidir. Redis, PostgreSQL ve JWT (JSON Web Tokens) teknolojilerini kullanarak güvenli ve ölçeklenebilir bir kimlik doğrulama çözümü sunar.
- Kullanıcı kaydı ve girişi
- JWT tabanlı kimlik doğrulama
- Redis ile oturum yönetimi
- Rol ve Yetki tabanlı yetkilendirme
- Hız sınırlama
- Hata işleme
- Güvenli token yenileme mekanizması
Proje aşağıdaki ana bileşenlerden oluşmaktadır:
- app.js: Ana uygulama dosyası
- config/: Veritabanı, Redis ve loglama yapılandırmaları
- controllers/: İş mantığı ve route işleyicileri
- middlewares/: Kimlik doğrulama, hata işleme ve hız sınırlama ara yazılımları
- models/: Veritabanı modelleri
- services/: Redis ve token işlemleri için servisler
- utils/: Yardımcı fonksiyonlar ve araçlar
JWT token'larının oluşturulması, doğrulanması ve yönetimi için kullanılır.
Önemli metodlar:
createBindingKey
: IP ve cihaz bilgilerini hashleyerekbindingKey
oluşturur.generateAccessToken
: Access token oluşturur.generateRefreshToken
: Refresh token oluşturur.verifyAccessToken
: Access token'ı doğrular.verifyRefreshToken
: Refresh token'ı doğrular.decodeToken
: Token'ı decode ederek içerisindeki bilgileri alırız.
Oturum yönetimi için Redis veritabanı ile etkileşimi sağlar.
Önemli metodlar:
setSession
: Yeni bir oturum kaydeder.delSession
: Bir oturumu siler.delAllSessions
: Belirli bir kullanıcının tüm oturumlarını siler.getSession
: Bir oturumu getirir.getAllSessionsByUser
: Belirli bir kullanıcının tüm oturumlarını alır.getAllSessions
: Tüm oturumları listeler.
- İstemciden gelen isteği alırız.
- İstek içinde
Authorization
başlığı olup olmadığını kontrol ederiz. Bu başlık, kullanıcının oturum açtığını belirtenBearer Access Token
'ı içerir.
Authorization
başlığı varsa, içindekiBearer Access Token
'ı alırız.Access Token
'ı doğrulama işlemi başlatılır. Bu işlemde, token'ın geçerli olup olmadığı ve istemcinin IP ve cihaz bilgileri ile uyumlu olup olmadığı kontrol edilir.- Başarılı Olursa:
req.user
değişkenine doğrulanan kullanıcı bilgilerini tanımlarız.return next()
diyerek sıradaki middleware'e geçeriz.
- Başarısız Olursa:
handleRefreshToken
middleware'ine yönlendiriliriz.
- Başarılı Olursa:
- İstekten
refreshToken
çerezini kontrol ederiz. refreshToken
varsa, token doğrulama işlemi başlatılır. Bu işlemde, token'ın geçerli olup olmadığı ve istemcinin IP ve cihaz bilgileri ile uyumlu olup olmadığı kontrol edilir.- Başarılı Olursa:
- Yeni bir
Access Token
oluşturulur. - Eski
Refresh Token
silinir ve yerine yeni birRefresh Token
oluşturulur. req.user
değişkenine doğrulanan kullanıcı bilgilerini tanımlarız.- Yeni oluşturulan
Access Token
'ı istemciye döneriz (header'dax-new-token
olarak). - Yeni
Refresh Token
'ı çerez olarak istemciye göndeririz. return next()
diyerek sıradaki middleware'e geçeriz.
- Yeni bir
- Başarısız Olursa:
req.user
null olarak kalır.return next()
diyerek sıradaki middleware'e geçeriz.
- Başarılı Olursa:
- Token Oluşturma:
- Token oluşturulurken, istemcinin IP ve cihaz bilgilerini hashleyerek
bindingKey
tanımlarız ve bunu token'a ekleriz.
- Token oluşturulurken, istemcinin IP ve cihaz bilgilerini hashleyerek
- Token Doğrulama:
- Token doğrulama işlemlerinde, istemcinin mevcut IP ve cihaz bilgilerini aynı şekilde hashleyerek token içindeki
bindingKey
ile karşılaştırırız.- Eşleşme Başarılı Olursa:
- Token doğrulama başarılı olur ve kullanıcı bilgileri alınır.
- Eşleşme Başarısız Olursa:
- Token doğrulama başarısız olur ve token kabul edilmez.
- Eşleşme Başarılı Olursa:
- Token doğrulama işlemlerinde, istemcinin mevcut IP ve cihaz bilgilerini aynı şekilde hashleyerek token içindeki
- IP ve cihaz bilgisine dayalı token bağlama
- Her token yenilemede işleminde yeniden oluşturulan refresh tokenlar
- Stateless access token'lar
- Güvenli şifre hashleme (bcrypt)
- HttpOnly ve Secure cookie'ler
- Rate limiting
- Rol tabanlı erişim kontrolü
- Redis kullanarak oturum yönetimi sağlanır. Bu, oturumları hızlı bir şekilde yönetmemizi ve doğrulama işlemlerini hızlıca gerçekleştirmemizi sağlar.
bindingKey
kullanımı ile her doğrulama işleminde IP ve cihaz bilgilerini kontrol ederek güvenliği artırırken, sadece geçerli oturumları kabul ederiz.- Yeni token oluşturma ve eski token'ları silme işlemleri asenkron olarak yapılır, bu da performans açısından avantaj sağlar.
bcrypt
: Şifreleri güvenli bir şekilde hashlemek için kullanılır.cookie-parser
: Çerezleri ayrıştırmak için kullanılır.dotenv
: Ortam değişkenlerini yönetmek için kullanılır.express
: Web uygulaması framework'ü.express-rate-limit
: İstek hızını sınırlamak için kullanılır.ioredis
: Redis istemcisi.jsonwebtoken
: JWT oluşturmak ve doğrulamak için kullanılır.pg
: PostgreSQL istemcisi.sequelize
: Promise tabanlı Node.js ORM aracı.ua-parser-js
: Kullanıcı ajanı bilgilerini ayrıştırmak için kullanılır.uuid
: UUID oluşturmak için kullanılır.
nodemon
: Geliştirme sırasında uygulamayı otomatik olarak yeniden başlatmak için kullanılır.
- Gerekli bağımlılıkları yükleyin:
npm install
- Çevre değişkenlerini ayarlayın (.env dosyası)
- Veritabanı ve Redis bağlantılarını yapılandırın
- Uygulamayı başlatın:
npm run dev
(geliştirme) veyanpm start
(prodüksiyon)