Node.js Uygulamalarında JWT Kimlik Doğrulaması İçin 9 Adım
Node.js uygulamalarınızda güvenli kimlik doğrulaması için JWT (JSON Web Token) kullanmanın en yaygın ve popüler yöntemlerinden biri olduğunu biliyor muydunuz? JWT, kullanıcının kimlik bilgilerini güvenli bir şekilde iletmek ve doğrulamak için mükemmel bir çözümdür.
Bu makalede, Node.js uygulamalarınızda JWT kimlik doğrulaması uygulamak için adım adım bir rehber sunacağım. JWT’nin temellerini, nasıl çalıştığını ve kendi uygulamalarınızda nasıl kullanacağınızı adım adım göstereceğim. Hazır mısınız? Haydi başlayalım!
JWT Nedir?
JWT (JSON Web Token) kısaca, kullanıcının kimlik bilgilerini ve ek bilgileri güvenli bir şekilde temsil eden bir standarttır. Bir JWT, üç bölümden oluşur:
- Başlık (Header): JWT türünü (JWT) ve kullanılan algoritmayı belirtir.
- Yük (Payload): Kullanıcı hakkında bilgi içeren, şifrelenmemiş JSON verileridir. (Örneğin, kullanıcı adı, e-posta adresi, rol, vb.)
- İmza (Signature): Başlık ve yükü şifreleyerek JWT’nin değiştirilmediğini garanti eder.
JWT’ler, uygulamalar arasında verileri güvenli bir şekilde paylaşmak için kullanılabilir. Bunlar, kullanıcı oturum açma işlemleri, yetkilendirme kontrolü ve API erişimi gibi birçok kullanım senaryosunda kullanışlıdır.
Node.js Uygulamalarında JWT Kimlik Doğrulaması
Şimdi Node.js uygulamalarında JWT kimlik doğrulaması uygulamak için 9 adıma daha yakından bakalım.
1. Proje Kurulumu
Yeni bir Node.js projesi oluşturun ve gerekli paketleri yükleyin:
“`bash
mkdir my-jwt-app
cd my-jwt-app
npm init -y
npm install express jsonwebtoken bcryptjs cors
“`
Bu komutlar:
- express: Web uygulaması oluşturmak için bir çerçeve.
- jsonwebtoken: JWT’ler oluşturmak ve doğrulamak için bir kütüphane.
- bcryptjs: Parolaları güvenli bir şekilde şifrelemek için kullanılan bir kütüphane.
- cors: Farklı kökenlerden gelen isteklere izin vermek için bir middleware.
2. Kullanıcı Modeli
Kullanıcı verilerini depolamak için bir model oluşturun (Örneğin, ‘user.js’):
“`javascript
const mongoose = require(‘mongoose’);
const Schema = mongoose.Schema;
const userSchema = new Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
module.exports = mongoose.model(‘User’, userSchema);
“`
3. Veritabanı Bağlantısı
Uygulamanızın kullanacağı veritabanına (MongoDB gibi) bağlanın.
“`javascript
const mongoose = require(‘mongoose’);
const mongoURI = ‘mongodb://localhost:27017/my-jwt-app’; // Veritabanı bağlantı bilgileri
mongoose.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log(‘MongoDB bağlantısı başarılı.’))
.catch(err => console.error(‘MongoDB bağlantı hatası:’, err));
“`
4. Kayıt İşlemi
Yeni kullanıcıları veritabanına eklemek için bir kayıt (sign-up) rotası oluşturun:
“`javascript
const express = require(‘express’);
const router = express.Router();
const User = require(‘../models/user’);
const bcryptjs = require(‘bcryptjs’);
router.post(‘/signup’, async (req, res) => {
const { username, password } = req.body;
try {
// Kullanıcı adı zaten var mı kontrol edin
const existingUser = await User.findOne({ username });
if (existingUser) {
return res.status(400).json({ message: ‘Kullanıcı adı zaten kullanılıyor.’ });
}
// Parola şifreleyin
const hashedPassword = await bcryptjs.hash(password, 10);
// Yeni kullanıcıyı veritabanına kaydedin
const newUser = new User({ username, password: hashedPassword });
await newUser.save();
res.status(201).json({ message: ‘Kullanıcı başarıyla kaydedildi.’ });
} catch (err) {
console.error(err);
res.status(500).json({ message: ‘Bir hata oluştu.’ });
}
});
module.exports = router;
“`
5. Oturum Açma İşlemi
Kullanıcıları kimlik doğrulamak için bir oturum açma (sign-in) rotası oluşturun:
“`javascript
const express = require(‘express’);
const router = express.Router();
const User = require(‘../models/user’);
const bcryptjs = require(‘bcryptjs’);
const jwt = require(‘jsonwebtoken’);
router.post(‘/signin’, async (req, res) => {
const { username, password } = req.body;
try {
const user = await User.findOne({ username });
if (!user) {
return res.status(401).json({ message: ‘Geçersiz kullanıcı adı veya parola.’ });
}
// Parola doğrulamasını yapın
const isValidPassword = await bcryptjs.compare(password, user.password);
if (!isValidPassword) {
return res.status(401).json({ message: ‘Geçersiz kullanıcı adı veya parola.’ });
}
// JWT oluşturun
const token = jwt.sign({ userId: user._id }, ‘secret-key’, { expiresIn: ‘1h’ });
res.status(200).json({ token, message: ‘Oturum açma başarılı.’ });
} catch (err) {
console.error(err);
res.status(500).json({ message: ‘Bir hata oluştu.’ });
}
});
module.exports = router;
“`
6. JWT Middleware
JWT’yi doğrulamak için bir middleware oluşturun:
“`javascript
const express = require(‘express’);
const jwt = require(‘jsonwebtoken’);
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization && req.headers.authorization.split(‘ ‘)[1];
if (!token) {
return res.status(401).json({ message: ‘Geçerli bir JWT tokeni sağlamalısınız.’ });
}
try {
const decoded = jwt.verify(token, ‘secret-key’);
req.user = decoded;
next();
} catch (err) {
console.error(err);
res.status(401).json({ message: ‘Geçersiz JWT tokeni.’ });
}
};
module.exports = authMiddleware;
“`
7. Korunan Rotalar
JWT middleware’ini kullanarak korunan rotalar oluşturun:
“`javascript
const express = require(‘express’);
const router = express.Router();
const authMiddleware = require(‘../middleware/auth’);
router.get(‘/protected’, authMiddleware, (req, res) => {
res.status(200).json({ message: ‘Bu bir korunan rota.’ });
});
module.exports = router;
“`
8. Uygulama Başlangıç
Uygulama sunucunuzu başlatın:
“`javascript
const express = require(‘express’);
const cors = require(‘cors’);
const signupRouter = require(‘./routes/signup’);
const signinRouter = require(‘./routes/signin’);
const protectedRouter = require(‘./routes/protected’);
const app = express();
app.use(cors());
app.use(express.json());
app.use(‘/api/v1/auth’, signupRouter);
app.use(‘/api/v1/auth’, signinRouter);
app.use(‘/api/v1/protected’, protectedRouter);
app.listen(3000, () => {
console.log(‘Sunucu 3000 portunda çalışıyor.’);
});
“`
9. Güvenlik Uygulamaları
JWT güvenliği için aşağıdaki hususlara dikkat etmek önemlidir:
- Güçlü bir gizli anahtar kullanın: JWT’leri şifrelemek için uzun ve rastgele bir gizli anahtar kullanın. Bu anahtarı asla doğrudan kodunuzda saklamayın, güvenli bir ortamda saklayın.
- JWT’leri doğru bir şekilde saklayın: JWT’leri istemci tarafında (tarayıcı) saklamak yerine, istemcinin JWT’yi sunucuya göndermesini sağlayacak bir güvenli mekanizma kullanın. JWT’leri güvenli çerezlerde veya yerel depolama alanında saklayabilirsiniz.
- JWT’lere son kullanma tarihi ekleyin: JWT’lerin geçerliliğini sınırlamak için son kullanma tarihi ayarlayın. Bu, yetkisiz erişimi önlemeye yardımcı olur.
- HTTP Only çerezleri kullanın: JWT’leri çerezlerde saklıyorsanız, HTTP Only çerezleri kullanın. Bu çerezlere JavaScript tarafından erişilmesini engeller.
- JWT’leri şifreleyin: Özellikle hassas bilgiler içeriyorsa JWT’leri şifreleyin. JWT’leri şifrelemek, yetkisiz kişilerin içeriğini okumasını önler.
Sonuç
Bu makalede, Node.js uygulamalarınızda JWT kimlik doğrulaması uygulama adımlarını inceledik. JWT güvenliği için önemli ipuçlarını da ele aldık. JWT, güvenli ve etkili bir kimlik doğrulama mekanizmasıdır ve Node.js uygulamalarınızı geliştirmek için kullanabileceğiniz değerli bir araçtır.
JWT’ler hakkında daha fazla bilgi edinmek ve uygulamanız için en uygun şekilde nasıl kullanılacağını öğrenmek için JWT.io dokümantasyonuna göz atabilirsiniz.
Umarım bu makale size JWT kimlik doğrulaması hakkında temel bir anlayış kazandırmıştır. Eğer Node.js ve JWT hakkında daha fazla sorunuz varsa, fatihsoysal.com adresinden bana ulaşabilirsiniz.
#Etiketler: JWT, Node.js, Kimlik Doğrulaması, Güvenlik, JSON Web Token, Uygulama Geliştirme, Web Geliştirme, Fatih Soysal
