Passport ve MongoDB Kullanarak NodeJS'de Kullanıcı Kimlik Doğrulaması

Passport ve MongoDB Kullanarak NodeJS'de Kullanıcı Kimlik Doğrulaması

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

Bu öğreticide, Passport ve MongoDB kullanarak Düğüm’de kimlik doğrulamasının nasıl uygulanacağını öğreneceksiniz.

Kimlik Doğrulama ve Yetkilendirme Nedir?

Kimlik doğrulama ve yetkilendirme bazen birbirinin yerine kullanılırken, bu iki güvenlik kavramı farklı anlamlara sahiptir. Kimlik doğrulama, yetkilendirme, kimliği doğrulanmış bir kullanıcının uygulamanızın belirli bölümlerine erişip erişmediğini belirleme işlemiyken, kullanıcının iddia ettiği kişi olduğunu doğrulama işlemidir.

Pasaport Nedir.js?

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

Bu öğretici kullanır pasaport-yerel ve pasaport-jwt güvenli rotalar için.

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

Artık kullanıcı kimlik doğrulaması ve Passport hakkında biraz şey biliyorsunuz.js, NodeJS’de kimlik doğrulamanın nasıl ayarlandırılacağına bakabiliriz. Aşağıda, atmanız gereken adımları özetledik.

Adım 1: Düğüm Sunucusu Kurma

Adlı klasör oluşturma kullanıcı kimlik doğrulama düğümleri ve terminalinizi kullanarak ona gidin.

mkdir user-auth-nodejs
                    

cd user-auth-nodejs

Sonraki başlatma paket.json.

npm init

NodeJS arka uç çerçevesi olan Express’i kullandığınızdan, aşağıdaki komutu çalıştırarak yükleyin.

npm i express

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

const express = require("express");
const app = express();
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Listening on port ${PORT}`);
});

İlgili: Ubuntu’ya Npm ve Node.js Nasıl Yükleneceğini Öğrenin

Adım 2: Veritabanını Ayarlama

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

Mongoose’u yükleyin.

npm i mongoose

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

const mongoose = require('mongoose')
const {Schema} = mongoose
const UserSchema = new Schema ({
email: {
type: String,
required: true
},
password: {
type: String,
required: true
}
})
const UserModel = mongoose.model('user', UserSchema);
module.exports = UserModel;

İlgili: MongoDB’de Veritabanı ve Koleksiyon Nasıl Oluşturulur

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

Yüklemek bcryptjs.

npm i bcryptjs

Değiştirmek kullanıcı modeli.js parolayı veritabanına kaydetmeden önce şifrelemek için.

const mongoose = require('mongoose')
const bcrypt = require('bcryptjs');
const {Schema} = mongoose

const UserSchema = new Schema ({
...
})
UserSchema.pre('save', async function(next) {
try {
// check method of registration
const user = this;
if (!user.isModified('password')) next();
// generate salt
const salt = await bcrypt.genSalt(10);
// hash the password
const hashedPassword = await bcrypt.hash(this.password, salt);
// replace plain text password with hashed password
this.password = hashedPassword;
next();
} catch (error) {
return next(error);
}
});
...
const User = mongoose.model('User', UserSchema);

Burada bir önceden kaydetme parolayı kaydedilmeden önce değiştirmek için kancayı takın. Amaç, düz metin parolası yerine parolanın karma sürümünü depolamaktır. Karma, düz metin dizesinden oluşturulan uzun karmaşık bir dizedir.

Kullanmak isModified parolanın değişip değişmediğini denetlemek için, yalnızca yeni parolalar karma yapmanız gerekir. Ardından, bir tuz oluşturun ve karma parolayı oluşturmak için karma yönteme düz metin parolasıyla geçirin. Son olarak, düz metin parolasını veritabanındaki karma parolayla değiştirin.

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

const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on("error", () => {
console.log("could not connect");
});
db.once("open", () => {
console.log("> Successfully connected to database");
});
};
module.exports = { connect };

Uygulamada.js veritabanına bağlanın.

// connect to db
const db = require('./db');
db.connect();

Adım 3: Pasaportu Ayarlama

Yüklemek Pasaport ve pasaport-yerel. Kayıt olmak için bu paketleri kullanacaksınız ve oturum açma kullanıcıları.

npm i passport
npm i passport-local

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

const LocalStraregy = require("passport-local").Strategy;
const User = require("./userModel");

Passport’ı kullanıcı kaydını işleyecek şekilde yapılandırın.

const LocalStrategy = require("passport-local");
const User = require("./userModel");
module.exports = (passport) => {
passport.use(
"local-signup",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
// check if user exists
const userExists = await User.findOne({ "email": email });
if (userExists) {
return done(null, false)
}
// Create a new user with the user data provided
const user = await User.create({ email, password });
return done(null, user);
} catch (error) {
done(error);
}
}
)
);
}

Yukarıdaki kodda, e-postanın zaten kullanımda olup olmadığını kontrol edersiniz. E-posta yoksa, kullanıcıyı kaydedin. Kullanıcı adı alanını da bir e-postayı kabul etmek için ayarladığınızı unutmayın. Varsayılan olarak, pasaport-yerel bir kullanıcı adı bekler, bu nedenle bunun yerine bir e-posta ile geçtiğinizi söylemeniz gerekir.

Kullanmak pasaport-yerel kullanıcı oturum açma işlemini de işlemek için.

module.exports = (passport) => {
passport.use(
"local-signup",
new localStrategy(
...
)
);
passport.use(
"local-login",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
const user = await User.findOne({ email: email });
if (!user) return done(null, false);
const isMatch = await user.matchPassword(password);
if (!isMatch)
return done(null, false);
// if passwords match return user
return done(null, user);
} catch (error) {
console.log(error)
return done(error, false);
}
}
)
);
};

Burada, kullanıcının veritabanında var olup olmadığını denetleyin ve varsa, sağlanan parolanın veritabanındaki parolayla eşleşip eşleşmediğini denetleyin. Ayrıca, matchPassword() kullanıcı modelinde yöntem bu yüzden git kullanıcıModel.js dosyasını açın ve ekleyin.

UserSchema.methods.matchPassword = async function (password) {
try {
return await bcrypt.compare(password, this.password);
} catch (error) {
throw new Error(error);
}
};

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

Adım 4: Kimlik Doğrulama Yollarını Ayarlama

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

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

app.post(
 "/auth/signup",
passport.authenticate('local-signup', { session: false }),
(req, res, next) => {
// sign up
res.json({
user: req.user,
});
}
);

İlgili: Kimlik Doğrulama ve Yetkilendirme: Fark Nedir?

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

Ardından, giriş yolunu oluşturun.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// login
res.json({
user: req.user,
});
}
);

Adım 5: Korumalı Yollar Ekleme

Şimdiye kadar, Pasaport bir kullanıcıyı veritabanına kaydeden bir ara yazılım ve kayıtlı bir kullanıcının oturum açmasına izin veren başka bir ara yazılım oluşturmak için. 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 şunları yapmanız gerekir:

  • JWT belirteci oluşturun.
  • Belirteci kullanıcıya geçirin. Kullanıcı yetkilendirme isteklerinde geri gönderir.
  • Kullanıcı tarafından geri gönderilen belirteci doğrulayın.

Bunu kullanacaksınız. jsonwebtoken JWT’leri işlemek için paket.

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

npm i jsonwebtoken

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

İçinde uygulama.jsIthalat jsonwebtoken ve aşağıdaki gibi giriş yolunu değiştirin.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// login
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
if(err) {
return res.json({
message: "Failed to login",
token: null,
});
}
res.json({
token
});
})
}
);

Gerçek hayattaki bir uygulamada, daha karmaşık bir gizli anahtar kullanır ve 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 Hedef korumalı yollara erişin.

npm i passport-jwt

İçinde passportConfig.js, pasaport-jwt.

const JwtStrategy = require("passport-jwt").Strategy;
const { ExtractJwt } = require("passport-jwt")
module.exports = (passport) => {
passport.use(
"local-login",
new LocalStrategy(
...
);
passport.use(
new JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("authorization"),
secretOrKey: "secretKey",
},
async (jwtPayload, done) => {
try {
// Extract user
const user = jwtPayload.user;
done(null, user);
} catch (error) {
done(error, false);
}
}
)
);
};

JWT’yi istek gövdesi yerine yetkilendirme üstbilgisinden ayıkladığı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 için pasaport-jwt koruma yolları, içinde korumalı bir rota oluşturun uygulama.js.

app.get(
"/user/protected",
passport.authenticate("jwt", { session: false }),
(req, res, next) => {
res.json({user: req.user});
}
);

Yalnızca geçerli bir JWT içeren bir istek kullanıcı verilerini döndürür.

Korumalı rotadan kullanıcı verileri

Artık Kullanıcı Kimlik Doğrulamanızı Bir Üst Seviyeye Götürmeye Hazırsınız

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

Yorum Yap
0 Yorum yapan