Verileri bir yerden başka bir yere mi gönderiyorsunuz? Kendi iç huzurunuz ve kullanıcılarınızın güvenliği için JWT ile güvenliğini sağlamalısınız.
Bir uygulama oluştururken, hassas verileri yetkisiz erişime karşı korumanız çok önemlidir. Birçok modern web, mobil ve bulut uygulaması, birincil iletişim aracı olarak REST API'lerini kullanır. Sonuç olarak, güvenlik ön planda olacak şekilde arka uç API'leri tasarlamak ve geliştirmek çok önemlidir.
Bir REST API'sini güvence altına almak için etkili bir yaklaşım, JSON Web Belirteçlerini (JWT'ler) içerir. Bu belirteçler, korunan kaynakların kötü niyetli aktörlerin erişimine karşı korunmasına yardımcı olarak, kullanıcı kimlik doğrulaması ve yetkilendirmesi için sağlam bir mekanizma sunar.
JSON Web Jetonları Nedir?
JSON Web Simgesi (JWT) yaygın olarak kullanılan bir güvenlik standardıdır. Bir istemci uygulaması ile bir arka uç sistemi arasında verileri güvenli bir şekilde iletmek için özlü, bağımsız bir yöntem sağlar.
Bir REST API, korumalı kaynaklara erişmek için HTTP istekleri yaptıklarında kullanıcıları güvenli bir şekilde tanımlamak ve doğrulamak için JWT'leri kullanabilir.
Bir JSON Web Jetonu üç farklı bölümden oluşur: başlık, yük ve imza. Her bir parçayı kodlar ve bir nokta (".") kullanarak bunları birleştirir.
Başlık, belirteci imzalamak için kullanılan kriptografik algoritmayı tanımlarken, yük, kullanıcı ve herhangi bir ek meta veri hakkında veri içerir.
Son olarak, başlık, yük ve gizli anahtar kullanılarak hesaplanan imza, belirtecin bütünlüğünü ve orijinalliğini sağlar.
JWT'lerin temelleri ortadan kalktıktan sonra, bir Node.js REST API oluşturalım ve JWT'leri uygulayalım.
Bir Express.js Uygulaması ve MongoDB Veritabanı Kurun
Basit bir kimlik doğrulamanın nasıl oluşturulacağını burada öğreneceksiniz. DİNLENME API'SI hem kayıt hem de oturum açma işlevlerini yöneten. Oturum açma işlemi bir kullanıcının kimliğini doğruladıktan sonra, kullanıcının korumalı bir API yoluna HTTP istekleri yapabilmesi gerekir.
Projenin kodunu burada bulabilirsiniz. GitHub deposu.
Başlamak, bir Express web sunucusu oluşturun, ve şu paketleri kurun:
npm kurulum kors dotenv bycrpt firavun faresi çerez ayrıştırıcı kripto jsonwebtoken mongodb
Sonraki, bir MongoDB veritabanı oluşturun veya bulutta bir MongoDB kümesi yapılandırın. Ardından veritabanı bağlantı dizesini kopyalayın, bir .env kök dizindeki dosya ve bağlantı dizesine yapıştırın:
CONNECTION_STRING="bağlantı dizisi"
Veritabanı Bağlantısını Yapılandırma
Yeni bir tane oluştur araçlar/db.js proje klasörünüzün kök dizinindeki dosya. Bu dosyada, Mongoose kullanarak veritabanı bağlantısını kurmak için aşağıdaki kodu ekleyin.
sabit firavun faresi = gerekmek('firavun faresi');
sabit bağlantıDB = zaman uyumsuz () => {
denemek {
beklemek firavun faresi.connect (işlem.env. BAĞLANTI DİZİSİ);
konsol.kayıt("MongoDB'ye bağlandı!");
} yakalamak (hata) {
konsol.hata("MongoDB'ye bağlanırken hata oluştu:", hata);
}
};
modül.exports = connectDB;
Veri Modelini Tanımlayın
Mongoose kullanarak basit bir kullanıcı veri şeması tanımlayın. Kök dizinde yeni bir tane oluşturun. model/user.model.js dosyasını açın ve aşağıdaki kodu ekleyin.
sabit firavun faresi = gerekmek('firavun faresi');
sabit kullanıcı Şeması = yeni firavun faresi Şema({
Kullanıcı adı: Sicim,
şifre: {
tip: Sicim,
gerekli: doğru,
eşsiz: doğru,
},
});
sabit Kullanıcı = mongoose.model("Kullanıcı", kullanıcı Şeması);
modül.exports = Kullanıcı;
API Rotaları için Denetleyicileri Tanımlayın
Denetleyici işlevleri, kayıt ve oturum açma işlemlerini yönetecektir; bunlar bu örnek programın önemli bir parçasıdır. Kök dizinde bir oluşturun controllers/userControllers.js dosyasını açın ve aşağıdaki kodu ekleyin:
- Kullanıcı kayıt denetleyicisini tanımlayın.
Bu kod parçacığı, sağlanan parolayı bcrypt kullanarak özetler ve ardından kullanıcı adını ve karma parolayı saklayarak veritabanında yeni bir kullanıcı kaydı oluşturur. Kayıt başarılı olursa, başarı mesajı içeren bir yanıt gönderir.sabit kullanıcı = gerekmek('../modeller/kullanıcı.model');
sabit şifreleme = gerekmek('şifreleme');
sabit { jeton oluştur } = gerekmek('../ara yazılım/auth');export.registerUser = zaman uyumsuz (gerekli, res) => {
sabit { kullanıcı adı, şifre } = req.body;denemek {
sabit karma = beklemek bcrypt.hash (şifre, 10);
beklemek User.create({ kullanıcı adı, şifre: doğramak });
res.status(201).Göndermek({ İleti: 'Kullanıcı başarıyla kaydedildi' });
} yakalamak (hata) {
konsol.log (hata);
res.status(500).Göndermek({ İleti: 'Bir hata oluştu!! ' });
}
}; - Kullanıcı oturum açma sürecini yönetmek için bir oturum açma denetleyicisi tanımlayın:
Bir kullanıcı bir istek gönderdiğinde /login rota, istek gövdesinde kimlik doğrulama bilgilerini iletmelidirler. Kod daha sonra bu kimlik bilgilerini doğrular ve bir JSON Web Simgesi oluşturur. Belirteç, bir tanımlama bilgisinde güvenli bir şekilde saklanır. httpYalnızca bayrak true olarak ayarlandı. Bu, istemci tarafı JavaScript'in simgeye erişmesini engelleyerek olası siteler arası komut dosyası çalıştırma (XSS) saldırılarına karşı koruma sağlar.export.loginUser = zaman uyumsuz (gerekli, res) => {
sabit { kullanıcı adı, şifre } = req.body;denemek {
sabit kullanıcı = beklemek User.findOne({ kullanıcı adı });
eğer (!kullanıcı) {
geri dönmek res.status(404).Göndermek({ İleti: 'Kullanıcı bulunamadı' });
}sabit şifreEşit = beklemek bcrypt.compare (şifre, kullanıcı.şifre);
eğer (!passwordMatch) {
geri dönmek res.status(401).Göndermek({ İleti: 'Geçersiz giriş bilgileri' });
}sabit yük = { Kullanıcı kimliği: Kullanıcı kimliği };
sabit belirteç = oluşturToken (yük);
res.cookie('jeton', jeton, { httpYalnızca: doğru });
res.status(200).json({ İleti: 'Giriş başarılı'});
} yakalamak (hata) {
konsol.log (hata);
res.status(500).Göndermek({ İleti: 'Giriş yapılırken bir hata oluştu' });
}
}; - Son olarak, korumalı bir rota tanımlayın:
JWT'yi bir tanımlama bilgisinde saklayarak, kimliği doğrulanmış kullanıcıdan gelen sonraki API istekleri otomatik olarak belirteci içerecek ve sunucunun istekleri doğrulamasına ve yetkilendirmesine izin verecektir.export.getUsers = zaman uyumsuz (gerekli, res) => {
denemek {
sabit kullanıcılar = beklemek Kullanıcı.bul({});
res.json (kullanıcılar);
} yakalamak (hata) {
konsol.log (hata);
res.status(500).Göndermek({ İleti: 'Bir hata oluştu!!' });
}
};
Bir Kimlik Doğrulama Ara Yazılımı Oluşturun
Başarılı kimlik doğrulaması üzerine bir JWT belirteci oluşturan bir oturum açma denetleyicisi tanımladığınıza göre, JWT belirtecini oluşturacak ve doğrulayacak ara yazılım kimlik doğrulama işlevlerini tanımlayın.
Kök dizinde yeni bir klasör oluşturun, ara yazılım. Bu klasörün içine iki dosya ekleyin: auth.js Ve yapılandırma.js.
bu kodu ekle yapılandırma.js:
sabit kripto = gerekmek('kripto');
modül.ihracat = {
gizliAnahtar: crypto.randomBytes(32).toString("altıgen")
};
Bu kod, her çalıştırıldığında yeni bir rasgele gizli anahtar oluşturur. Daha sonra, JWT'lerin orijinalliğini imzalamak ve doğrulamak için bu gizli anahtarı kullanabilirsiniz. Bir kullanıcının kimliği başarıyla doğrulandıktan sonra, gizli anahtarla bir JWT oluşturun ve imzalayın. Sunucu daha sonra JWT'nin geçerli olduğunu doğrulamak için anahtarı kullanacaktır.
içine aşağıdaki kodu ekleyin auth.js JWT'leri oluşturan ve doğrulayan ara yazılım işlevlerini tanımlar.
sabit jwt = gerekmek("jsonwebtoken");
sabit { gizliAnahtar } = gerekmek('./config');sabit oluşturToken = (yük) => {
sabit belirteç = jwt.sign (yük, gizliKey, { içinde sona eriyor: "1sa" });
geri dönmek jeton ;
};sabit doğrulamaToken = (talep, res, sonraki) => {
sabit belirteç = talep.cookies.token;eğer (!jeton) {
geri dönmek res.status(401).json({ İleti: 'Belirteç sağlanmadı' });
}jwt.verify (token, secretKey, (err, decoded) => {
eğer (hata) {
geri dönmek res.status(401).json({ İleti: 'Geçersiz belirteç' });
}req.userId = kodu çözülmüş.userId;
Sonraki();
});
};
modül.exports = {üretmeToken, doğrulamaToken};
bu Oluşturmak işlevi, gizli bir anahtar kullanarak bir yükü imzalayarak ve bir sona erme süresi ayarlayarak bir JWT oluşturur. doğrulamaToken işlev, sağlanan bir belirtecin gerçekliğini ve geçerliliğini doğrulamak için bir ara yazılım görevi görür.
API Yollarını Tanımlayın
Yeni bir tane oluştur yollar/userRoutes.js dosyasını kök dizine kopyalayın ve aşağıdaki kodu ekleyin.
sabit ifade = gerekmek('ifade etmek');
sabit yönlendirici = ekspres. Yönlendirici();
sabit userControllers = gerekmek('../kontrolörler/kullanıcıKontrolcüler');
sabit { doğrulamaToken } = gerekmek('../ara yazılım/auth');
yönlendirici.post("/api/kayıt", userControllers.registerUser);
yönlendirici.post('/api/giriş', userControllers.loginUser);
yönlendirici.get("/api/kullanıcılar", doğrulamaToken, userControllers.getUsers);
modül.export = yönlendirici;
Sunucu Giriş Noktanızı Güncelleyin
güncelleyin sunucu.js aşağıdaki kod ile dosya.
sabit ifade = gerekmek('ifade etmek');
sabit korlar = gerekmek('kors');
sabit uygulama = ekspres();
sabit bağlantı noktası = 5000;
gerekmek('dotenv').config();
sabit bağlantıDB = gerekmek('./utils/db');
sabit çerezParser = gerekmek('çerez ayrıştırıcı');connectDB();
app.use (express.json());
app.use (express.urlencoded({ uzatılmış: doğru }));
app.use (kors());
app.use (cookieParser());
sabit kullanıcıYolları = gerekmek('./routes/userRoutes');
uygulama.kullan('/', kullanıcıRoutes);
app.listen (bağlantı noktası, () => {
konsol.kayıt(`Sunucu şu saatte dinliyor: http://localhost:${bağlantı noktası}`);
});
REST API'yi test etmek için geliştirme sunucusunu çalıştırın ve tanımlanan uç noktalara API istekleri yapın:
düğüm sunucusu.js
Node.js REST API'lerinin güvenliğini sağlama
Node.js REST API'lerinin güvenliğini sağlamak, yalnızca JWT'leri kullanmanın ötesine geçer, ancak bunlar kimlik doğrulamada çok önemli bir rol oynar ve yetkilendirme, arka ucunuzu korumak için güvenliğe bütünsel bir güvenlik yaklaşımı benimsemek önemlidir. sistemler. JWT'lerin yanı sıra, iletişimi, giriş doğrulamayı ve temizlemeyi ve diğer pek çok şeyi şifrelemek için HTTPS'yi uygulamayı da düşünmelisiniz.
Birden fazla güvenlik önlemini birleştirerek, cihazınız için sağlam bir güvenlik çerçevesi oluşturabilirsiniz. Node.js REST API'leri ve yetkisiz erişim, veri ihlalleri ve diğer güvenlik risklerini en aza indirin tehditler.