Merhaba arkadaşlar, bu yazımda sizlere Node.js ile Blog API Geliştirme Rehberi: Kullanıcı Modeli ve Kimlik Doğrulama konusundan bahsedeceğim.
Yazı serimizin 3. bölümünde kullanıcı modelimizi oluşturacağız ve kimlik doğrulama işlemlerini nasıl gerçekleştireceğimizi adım adım ele alacağız. Bu yazı, uygulamanızda kullanıcı yönetimini ve güvenliğini sağlamak için gereken temelleri kapsamaktadır.
1. Kullanıcı Modeli Oluşturma
models
klasörü altında User.js
dosyasını oluşturuyoruz ve kullanıcı bilgilerini tutacak bir MongoDB şeması tanımlıyoruz.
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const UserSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
}, { timestamps: true });
// Şifreyi hash'lemek için bir middleware
UserSchema.pre('save', async function (next) {
if (!this.isModified('password')) return next();
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
next();
});
module.exports = mongoose.model('User', UserSchema);
Bcryptjs ile ilgili işlemler için bir önceki yazımı inceleyebilirsiniz.
Node.js ile Bcrypt Kullanarak Şifre Hashleme ve Doğrulama
Bcyrpt paketine aşağıdaki linkten de erişebilirsiniz.
https://www.npmjs.com/package/bcrypt
2. Kimlik Doğrulama İçin Kullanıcı Servisi
services
klasöründe userService.js
dosyasını oluşturuyoruz. Bu servis, kullanıcıların kimlik doğrulama ve veri işlemleri için kullanılacak metotları içerecek.
const User = require('../models/User');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const registerUser = async (userData) => {
const { email, password } = userData;
// E-posta kontrolü
const existingUser = await User.findOne({ email });
if (existingUser) throw new Error('Email already exists');
const newUser = new User(userData);
await newUser.save();
return generateToken(newUser._id);
};
const loginUser = async (email, password) => {
const user = await User.findOne({ email });
if (!user) throw new Error('Invalid credentials');
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) throw new Error('Invalid credentials');
return generateToken(user._id);
};
const generateToken = (userId) => {
return jwt.sign({ id: userId }, process.env.JWT_SECRET, { expiresIn: '1h' });
};
module.exports = { registerUser, loginUser };
3. Kullanıcı Endpointleri Oluşturma
routes
klasöründe userRoutes.js
dosyasını oluşturuyoruz ve kayıt, giriş işlemleri için endpointler tanımlıyoruz.
const express = require('express');
const { registerUser, loginUser } = require('../services/userService');
const authMiddleware = require('../middleware/authMiddleware');
const router = express.Router();
// Kayıt olma
router.post('/register', async (req, res) => {
try {
const token = await registerUser(req.body);
res.status(201).json({ token });
} catch (err) {
res.status(400).json({ message: err.message });
}
});
// Giriş yapma
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
const token = await loginUser(email, password);
res.json({ token });
} catch (err) {
res.status(400).json({ message: err.message });
}
});
// Kullanıcı profilini alma (Kimlik doğrulaması gereklidir)
router.get('/profile', authMiddleware, async (req, res) => {
try {
res.json({ message: `User profile for user ID: ${req.user}` });
} catch (err) {
res.status(500).json({ message: 'Server error' });
}
});
module.exports = router;
4. Kimlik Doğrulama Middleware’i
middleware
klasöründe authMiddleware.js
dosyasını oluşturuyoruz. Bu middleware, endpointlere erişim öncesi JWT doğrulaması yapacak.
const jwt = require('jsonwebtoken');
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ message: 'No token, authorization denied' });
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded.id;
next();
} catch (err) {
res.status(401).json({ message: 'Token is not valid' });
}
};
module.exports = authMiddleware;
5. app.js Güncellemeleri
Son olarak, userRoutes.js
dosyasını app.js
içerisinde dahil ediyoruz.
const userRoutes = require('./routes/userRoutes');
// Kullanıcı rotalarını tanımlıyoruz
app.use('/api/users', userRoutes);
Test İşlemi
- Terminalden uygulamamızı başlatıyoruz:
npm start
2. Postman ile aşağıdaki endpointleri test edebiliriz:
- Kayıt Olma:
- POST:
http://localhost:5000/api/users/register
- Body (JSON):
- POST:
{
"name": "Test User1",
"email": "user1@test.com",
"password": "sifre"
}
Giriş Yapma:
- POST:
http://localhost:5000/api/users/login
- Body (JSON):
{
"email": "user1@test.com",
"password": "sifre"
}
Umarım faydalı olur.
Bir sonraki yazıda görüşmek üzere…