Düğüm uygulamanızdaki hassas içeriği korumak istiyorsanız, kullanıcıların kimliğini doğrulamak için bir yola ihtiyacınız vardır. Ancak, kendi kimlik doğrulama sisteminizi oluşturmak karmaşıktır ve zaman alıcıdır ve doğru şekilde yapılmazsa uygulamanızda güvenlik açıkları oluşturabilir. Passport gibi üçüncü taraf araçlar, kimlik doğrulamasını kolaylaştırır.

Bu öğreticide, Passport ve MongoDB kullanarak Node'da kimlik doğrulamanın nasıl uygulanacağını öğreneceksiniz.

Kimlik Doğrulama ve Yetkilendirme Nedir?

Kimlik doğrulama ve yetkilendirme bazen birbirinin yerine kullanılsa da, bu iki güvenlik kavramının farklı anlamları vardır. Kimlik doğrulama, bir kullanıcının iddia ettiği kişi olduğunu doğrulama işlemidir, yetkilendirme ise Kimliği doğrulanmış bir kullanıcının uygulamanızın belirli bölümlerine erişimi olup olmadığını belirleme süreci.

Passport.js Nedir?

Passport.js (veya Passport), kullanıcıların kimliğini doğrulamak için 500'den fazla strateji sağlayan NodeJS için bir kimlik doğrulama ara yazılımıdır. pasaport-yerel hangi bir kullanıcı adı ve şifre kullanır.

instagram viewer

Bu öğretici kullanır pasaport-yerel ve pasaport-jwt yolları güvence altına almak için.

NodeJS'de Kullanıcı Kimlik Doğrulaması Nasıl Kurulur

Artık kullanıcı kimlik doğrulaması ve Passport.js hakkında biraz bilgi sahibi olduğunuza göre, NodeJS'de kimlik doğrulamanın nasıl kurulacağına bakabiliriz. Aşağıda, atmanız gereken adımları özetledik.

1. Adım: Bir Düğüm Sunucusu Kurun

adlı bir klasör oluşturun kullanıcı-auth-nodejs ve terminalinizi kullanarak ona gidin.

mkdir kullanıcı-auth-nodejs. 

cd kullanıcı-auth-nodejs

Sonraki başlatma paket.json.

npm başlangıç

kullanacağın için ifade etmek, bir NodeJS arka uç çerçevesi, aşağıdaki komutu çalıştırarak yükleyin.

npm ifade ediyorum

Şimdi bir dosya oluşturun, app.js, ve sunucuyu oluşturmak için aşağıdaki kodu ekleyin.

const ifade = gerekli ("ekspres");
const uygulama = ekspres();
const PORT = 3000;
app.listen (PORT, () => {
konsol.log(`${PORT} portunda dinleme yapılıyor`);
});

İlişkili: Ubuntu'da Npm ve Node.js Kurulumunu Öğrenin

Adım 2: Veritabanını Kurun

Kullanıcı verilerini depolamak için bir veritabanına ihtiyacınız var. Veritabanında depolayacağınız verilerin yapısını ve türünü tanımlayan bir MongoDB veri şeması oluşturmak için mongoose kullanacaksınız. Kullanıcı verilerini depoladığınız için bir kullanıcı şeması oluşturun.

Mongoose'u yükleyin.

npm ben firavun faresi

Yeni bir dosya oluşturun, kullanıcıModel.js, ve aşağıdakileri ekleyin.

const firavun faresi = gerekli ('firavun faresi')
const {Şema} = firavun faresi
const UserSchema = yeni Şema ({
e-posta: {
tür: Dize,
gerekli: doğru
},
şifre: {
tür: Dize,
gerekli: doğru
}
})
const UserModel = mongoose.model('kullanıcı', UserSchema);
module.exports = KullanıcıModel;

İlişkili: MongoDB'de Veritabanı ve Koleksiyon Nasıl Oluşturulur

Parolayı saklamadan önce, güvenlik amacıyla şifrelemeniz gerekir. kullanacaksın bcryptjs, şifreli parolalarla çalışmayı kolaylaştıran çok kullanışlı bir npm paketi.

Düzenlemek bcryptjs.

npm ve bcryptjs

değiştir kullanıcımodeli.js veritabanına kaydetmeden önce şifreyi şifrelemek için.

const firavun faresi = gerekli ('firavun faresi')
const bcrypt = require('bcryptjs');
const {Şema} = firavun faresi

const UserSchema = yeni Şema ({
...
})
UserSchema.pre('kaydet', zaman uyumsuz işlev (sonraki) {
denemek {
// kayıt yöntemini kontrol et
const kullanıcı = bu;
if (!user.isModified('password')) next();
// tuz üret
const salt = bekle bcrypt.genSalt (10);
// şifreyi hash et
const hashedPassword = bekle bcrypt.hash (this.password, salt);
// düz metin şifresini karma şifre ile değiştirin
this.password = hashedPassword;
sonraki();
} yakalama (hata) {
sonraki dönüş (hata);
}
});
...
const Kullanıcı = mongoose.model('Kullanıcı', UserSchema);

Burada bir kullanıyorsunuz ön kaydetme Kaydedilmeden önce şifreyi değiştirmek için kanca. Buradaki fikir, düz metin parolası yerine parolanın karma sürümünü saklamaktır. Karma, düz metin dizesinden oluşturulan uzun karmaşık bir dizedir.

Kullanmak Değiştirildi sadece yeni şifreleri hash etmeniz gerektiğinden şifrenin değişip değişmediğini kontrol etmek için. Ardından, bir tuz oluşturun ve karma parolayı oluşturmak için düz metin parolasıyla karma yöntemine iletin. Son olarak, düz metin şifresini veritabanındaki karma şifre ile değiştirin.

db.js oluşturun ve veritabanını yapılandırın.

const firavun faresi = require("firavun faresi");
firavun faresi. Söz = küresel. Söz vermek;
const dbUrl = "mongodb://localhost/user";
const connect = zaman uyumsuz () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.bağlantı;
db.on("hata", () => {
konsol.log("bağlanamadı");
});
db.once("aç", () => {
konsol.log("> Veritabanına başarıyla bağlanıldı");
});
};
modül.exports = {bağlan };

app.js'de veritabanına bağlanın.

// db'ye bağlan
const db = gerekli('./db');
db.connect();

3. Adım: Pasaportunuzu Ayarlayın

Düzenlemek Pasaport ve pasaport-yerel. Kullanıcıları kaydetmek ve oturum açmak için bu paketleri kullanacaksınız.

npm ben pasaport
npm i pasaport-yerel

Yeni bir dosya oluşturun, pasaportConfig.jsve içe aktar pasaport-yerel ve kullanıcıModel.js.

const LocalStraregy = require("pasaport-yerel").Strategy;
const Kullanıcı = require("./userModel");

Kullanıcı kaydını işlemek için Passport'u yapılandırın.

const LocalStrategy = require("pasaport-yerel");
const Kullanıcı = require("./userModel");
modül.exports = (pasaport) => {
pasaport.use(
"yerel kayıt",
yeni LocalStrategy(
{
usernameField: "e-posta",
passwordField: "parola",
},
zaman uyumsuz (e-posta, şifre, bitti) => {
denemek {
// kullanıcının var olup olmadığını kontrol et
const userExists = bekle User.findOne({ "email": email });
if (userExists) {
dönüş yapıldı (boş, yanlış)
}
// Sağlanan kullanıcı verileriyle yeni bir kullanıcı oluşturun
const user = bekle User.create({ email, password });
dönüş yapıldı (boş, kullanıcı);
} yakalama (hata) {
yapıldı (hata);
}
}
)
);
}

Yukarıdaki kodda, e-postanın zaten kullanımda olup olmadığını kontrol ediyorsunuz. E-posta yoksa, kullanıcıyı kaydedin. Kullanıcı adı alanını da bir e-postayı kabul edecek şekilde ayarladığınızı unutmayın. Varsayılan olarak, pasaport-yerel bir kullanıcı adı bekliyor, bu yüzden ona bir e-posta ilettiğinizi söylemeniz gerekiyor.

Kullanmak pasaport-yerel ayrıca kullanıcı oturum açma işlemlerini yapmak için.

modül.exports = (pasaport) => {
pasaport.use(
"yerel kayıt",
yeni yerelStrateji(
...
)
);
pasaport.use(
"yerel giriş",
yeni LocalStrategy(
{
usernameField: "e-posta",
passwordField: "parola",
},
zaman uyumsuz (e-posta, şifre, bitti) => {
denemek {
const user = bekle User.findOne({ email: email });
if (!user) dönüşü tamamlandı (null, false);
const isMatch = user.matchPassword (şifre);
eğer (!isMatch)
dönüş yapıldı (boş, yanlış);
// şifreler geri dönen kullanıcıyla eşleşirse
dönüş yapıldı (boş, kullanıcı);
} yakalama (hata) {
konsol.log (hata)
dönüş yapıldı (hata, yanlış);
}
}
)
);
};

Burada, kullanıcının veritabanında olup olmadığını kontrol edin ve varsa, sağlanan şifrenin veritabanındaki ile eşleşip eşleşmediğini kontrol edin. Ayrıca şunu da aradığınızı unutmayın: maçParola() kullanıcı modelindeki yöntem, bu nedenle kullanıcıModel.js dosya ve ekleyin.

UserSchema.methods.matchPassword = zaman uyumsuz işlev (parola) {
denemek {
dönüş bekliyor bcrypt.compare (şifre, this.password);
} yakalama (hata) {
yeni Hata (hata) atmak;
}
};

Bu yöntem, kullanıcıdan gelen parola ile veritabanındaki parolayı karşılaştırır ve eşleşirse true değerini döndürür.

4. Adım: Kimlik Doğrulama Yollarını Ayarlayın

Artık kullanıcıların veri göndereceği uç noktaları oluşturmanız gerekiyor. İlki, yeni bir kullanıcının e-postasını ve şifresini kabul edecek olan kayıt yoludur.

İçinde app.js, kullanıcıyı kaydetmek için az önce oluşturduğunuz pasaport kimlik doğrulama ara yazılımını kullanın.

uygulama.post(
 "/auth/kayıt",
pasaport.authenticate('local-signup', { session: false }),
(req, res, sonraki) => {
// üye olmak
res.json({
kullanıcı: req.user,
});
}
);

İlişkili: Kimlik doğrulama vs. Yetkilendirme: Fark Nedir?

Başarılı olursa, kayıt yolu oluşturulan kullanıcıyı döndürmelidir.

Ardından, oturum açma rotasını oluşturun.

uygulama.post(
"/auth/login",
pasaport.authenticate('local-login', { session: false }),
(req, res, sonraki) => {
// giriş yapmak
res.json({
kullanıcı: req.user,
});
}
);

Adım 5: Korumalı Rotalar Ekleyin

Şimdiye kadar kullandın Pasaport bir kullanıcıyı veritabanına kaydeden ve kayıtlı bir kullanıcının oturum açmasına izin veren bir ara katman yazılımı oluşturmak. Ardından, bir JSON web belirteci (JWT) kullanarak hassas yolları korumak için bir yetkilendirme ara yazılımı oluşturacaksınız. JWT yetkilendirmesini uygulamak için yapmanız gerekenler:

  • JWT belirteci oluşturun.
  • Belirteci kullanıcıya iletin. Kullanıcı, yetkilendirme isteklerinde geri gönderecektir.
  • Kullanıcı tarafından geri gönderilen belirteci doğrulayın.

kullanacaksın jsonwebtoken JWT'leri işlemek için paket.

Yüklemek için aşağıdaki komutu çalıştırın.

npm ben jsonwebtoken

Ardından, başarıyla oturum açan her kullanıcı için bir belirteç oluşturun.

İçinde app.js, içe aktarmak jsonwebtoken ve aşağıdaki gibi giriş yolunu değiştirin.

uygulama.post(
"/auth/login",
pasaport.authenticate('local-login', { session: false }),
(req, res, sonraki) => {
// giriş yapmak
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (hata, belirteç) => {
eğer (hata) {
res.json'ı döndür({
mesaj: "Giriş yapılamadı",
belirteç: boş,
});
}
res.json({
jeton
});
})
}
);

Gerçek hayattaki bir uygulamada, daha karmaşık bir gizli anahtar kullanır ve onu bir yapılandırma dosyasında saklarsınız.

Oturum açma yolu, başarılı olursa bir belirteç döndürür.

Kullanmak pasaport-jwt korumalı rotalara erişmek için.

npm i pasaport-jwt

İçinde pasaportConfig.js, yapılandır pasaport-jwt.

const JwtStrategy = require("pasaport-jwt").Strategy;
const { ExtractJwt } = require("pasaport-jwt")
modül.exports = (pasaport) => {
pasaport.use(
"yerel giriş",
yeni LocalStrategy(
...
);
pasaport.use(
yeni JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("yetkilendirme"),
secretOrKey: "gizliKey",
},
zaman uyumsuz (jwtPayload, tamamlandı) => {
denemek {
// Kullanıcıyı çıkar
const kullanıcı = jwtPayload.user;
done (boş, kullanıcı);
} yakalama (hata) {
yapıldı (hata, yanlış);
}
}
)
);
};

JWT'yi istek gövdesi yerine yetkilendirme başlığından çıkardığınıza dikkat edin. Bu, bilgisayar korsanlarının bir isteği ele geçirmesini ve belirteci ele geçirmesini önler.

Nasıl olduğunu görmek pasaport-jwt rotaları korur, içinde korumalı bir rota oluşturun uygulama.js

app.get(
"/kullanıcı/korumalı",
pasaport.authenticate("jwt", { oturum: yanlış }),
(req, res, sonraki) => {
res.json({kullanıcı: gerekli.kullanıcı});
}
);

Yalnızca geçerli bir JWT'ye sahip bir istek, kullanıcı verilerini döndürür.

Artık Kullanıcı Kimlik Doğrulamanızı Bir Sonraki Seviyeye Taşımaya Hazırsınız

Bu öğreticide, Passport'un yardımıyla bir e-posta ve parola kullanarak kullanıcıların kimliğini nasıl doğrulayabileceğinizi öğrendiniz. İlk başta göz korkutucu görünebilir, ancak süreç nispeten basittir. Daha da ileri gidebilir ve Passport tarafından desteklenen Twitter, Facebook ve Google gibi üçüncü taraf kimlik sağlayıcılarını kullanabilirsiniz.

Kullanıcı Kimlik Doğrulaması Nedir ve Nasıl Çalışır?

Çevrimiçi hesaplarınız için maksimum güvenlik düzeyini sağlamak için kullanıcı kimlik doğrulamasının temellerini anlamak önemlidir. Öyleyse, içeri girelim.

Sonrakini Oku

PaylaşCıvıldamakE-posta
İlgili konular
  • Programlama
  • Programlama
  • Programlama dilleri
  • Programlama Araçları
Yazar hakkında
Mary Gathoni (8 Makale Yayınlandı)

Mary Gathoni, yalnızca bilgilendirici değil, aynı zamanda ilgi çekici teknik içerik oluşturma tutkusuna sahip bir yazılım geliştiricisidir. Kod yazmadığı veya yazmadığı zamanlarda arkadaşlarıyla takılmaktan ve dışarıda olmaktan hoşlanıyor.

Mary Gathoni'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın