Bir geliştirici olarak, kullanıcılarınızın verilerini kimlik doğrulama yoluyla korumak sizin sorumluluğunuzdadır. Bir Düğüm ve Postgres uygulamasında kullanıcıların kimliğini doğrulamak için Passport.js’yi kullanabilirsiniz.
Kullanıcıları kaydetmek, oturum açmak ve oturumu kapatmak için uç noktaları olan bir Düğüm sunucusu oluşturarak başlayın. Uygulamanıza yetkisiz erişimi kısıtlamak için Passport’un kimlik doğrulamasını yapmasına izin verebilirsiniz.
Kullanıcılar Tablosu Oluşturma
Kullanıcı kimlik doğrulaması için bir e-posta ve parola kullanacaksınız. Bu, users tablosunun bir e-posta ve parola alanı içermesi gerektiği anlamına gelir. psql komut isteminde, nodeapp adlı yeni bir veritabanı oluşturun:
CREATE DATABASE nodeapp;
Ardından, kullanıcıları depolamak için bir tablo oluşturun:
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email CHAR(128),
password CHAR(60)
);
Bu kod, e-posta, şifre ve otomatik olarak oluşturulmuş bir kimlik alanı içeren yeni bir tablo oluşturacaktır.
Düğüm Sunucusu Oluşturma
Node.js, hızlı bir şekilde HTTP sunucuları oluşturmamızı sağlayan sunucu taraflı bir JavaScript çalıştırma ortamıdır. Sunucu oluşturma sürecini ve farklı HTTP rotalarını basitleştirmek için bir Node.js web çerçevesi olan Express’i kullanabilirsiniz .
Postgres-auth adlı yeni bir klasör oluşturmak için bu komutu çalıştırın:
mkdir postgres-auth
Ardından, npm’yi başlatın:
npm init -y
Son olarak, Express’i kurun:
npm install express
Artık Düğüm web sunucusunu oluşturabilirsiniz .
index.js adlı yeni bir dosyaya aşağıdakileri ekleyin:
const express = require(“express”);
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.listen(3000, () => console.log(“Listening on port 3000”));
Bu kodun çalıştırılması sunucuyu başlatacak ve aşağıdakileri konsolda günlüğe kaydedecektir:
Listening on port 3000
PostgreSQL’e bağlanma
PostgreSQL’e bağlanmak için node -postgres kullanın . node-postgres, Node ve Postgres arasında bir arabirim sağlayan bir bağlantı sürücüsüdür.
Node-postrges’i npm aracılığıyla kurmak için aşağıdakileri yürütün:
npm install pg
Bu kitaplığı yükledikten sonra, db.js adlı yeni bir dosya oluşturun ve onu veritabanına bağlayın:
const { Client } = require(“pg”);
const { user, host, database, password, port } = require(“./dbConfig”);
const client = new Client({
user,
host,
database,
password,
port,
});
client.connect();
module.exports = client;
Node-postgres’den gelen istemci yöntemi, bağlandığınız veritabanının ayrıntılarını alır. Bu program, bağlantı ayrıntılarını dbConfig adlı bir dosyadan alır . Bu nedenle, bu dosyayı oluşturun ve ona aşağıdaki kodu ekleyin:
module.exports = {
user: “postgres”,
host: “localhost”,
database: “nodeapp”,
password: “yourPassword”,
port: 5432,
};
Veritabanı Yardımcı İşlevleri Oluşturma
Veritabanıyla etkileşim kurmak için bireysel işlevleri kullanmak her zaman iyi bir uygulamadır. Birim testleri yazmayı ve yeniden kullanılabilirliği geliştirmeyi kolaylaştırırlar. Kayıt uç noktası için iki işlev oluşturmanız gerekir:
E-postanın zaten kayıtlı olup olmadığını kontrol etmek için.
Kullanıcı oluşturmak için.
Amaç, bir kullanıcıyı yalnızca veritabanında yoksa kaydetmektir.
helper.js adlı yeni bir dosya oluşturun ve veritabanı istemcisini db.js’den içe aktarın:
const client = require(“./db.js”)
Ardından, emailExists() adlı yeni bir işlev ekleyin:
const emailExists = async (email) => {
const data = await client.query(“SELECT * FROM users WHERE email=$1”, [
email,
]);
if (data.rowCount == 0) return false;
return data.rows[0];
};
Bu işlev bir e-posta alır ve halihazırda kullanımda olup olmadığını kontrol eder. Bunu, kayıt yapan kullanıcı tarafından sağlanan değerle eşleşen bir e-posta alanına sahip bir satır döndüren SELECT yan tümcesini kullanarak yapar. E-posta yoksa, false döndürür.
Kullanıcıyı oluşturan bir işlev oluşturmak için helper.js dosyasına createUser() adlı bir işlev ekleyin:
const createUser = async (email, password) => {
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(password, salt);
const data = await client.query(
”INSERT INTO users(email, password) VALUES ($1, $2) RETURNING id, email, password”,
[email, hash]
);
if (data.rowCount == 0) return false;
return data.rows[0];
};
Bu işlev, e-posta ve parola değerlerini alır. Bu ayrıntılarla yeni bir satır oluşturmak için INSERT yan tümcesini kullanır ve başarılı olursa yeni oluşturulan kullanıcıyı döndürür. Parolayı saklamadan önce bcrypt kullanarak hash oluşturmanız gerektiğini unutmayın . Parolaları düz metin olarak saklamak hiçbir zaman iyi bir fikir değildir. Bilgisayar korsanları kullanıcı veritabanınıza erişirse, hassas bilgilere kolayca erişebilirler.
Kullanmaya başlamak için bcryptjs’yi kurun:
npm install bcryptjs
helper.js’de bcryptjs’yi içe aktarın:
const bcrypt = require(“bcryptjs”)
Bcryptjs kullanılarak, veritabanı yalnızca şifrelenmiş parolayı saklar. Bu nedenle, oturum açma sırasında, kullanıcı tarafından verilen düz metin şifre ile veri tabanındaki hashlenmiş şifreyi karşılaştırmanız gerekecektir. Bunun için Bcryptjs tarafından sağlanan karşılaştırma yöntemini kullanabilirsiniz.
matchPassword() adlı bir işlev oluşturun:
const matchPassword = async (password, hashPassword) => {
const match = await bcrypt.compare(password, hashPassword);
return match
};
Düz parolayı ve karmayı alır ve ardından sağlanan parolanın doğru olup olmadığını belirlemek için Bcrypt.compare()’yi kullanır. Eğer öyleyse, true döndürür, aksi takdirde false döndürür.
Bunlar, veritabanıyla etkileşim kurmak için kullanacağımız tüm işlevlerdir. Sonunda hepsini dışa aktardığınızdan emin olun:
module.exports = { emailExists, createUser, matchPassword };
Pasaportu Yapılandır
Passport, sosyal oturum açma, JSON Web Belirteçleri (JWT) ve e-posta kimlik doğrulaması gibi 500’den fazla kimlik doğrulama stratejisi sağlayan bir Düğüm kimlik doğrulama ara yazılımıdır. Pasaport-yerel stratejisinin sağladığı ikincisini kullanacağız.
Pasaport ve pasaport-yerel yüklemek için aşağıdaki komutu kullanın:
npm install passport
npm install passport-local
Ardından, mevcut kullanıcılara giriş yapmak ve yeni kullanıcıları kaydetmek için Passport’u yapılandırın.
Yeni bir pasaportConfig.js dosyası oluşturarak başlayın . Ardından, az önce oluşturduğunuz Passport yerel stratejisini ve veritabanı yardımcı işlevlerini içe aktarın:
const LocalStrategy = require(“passport-local”);
const { emailExists, createUser, matchPassword } = require(“./helper”);
Kullanıcı kaydını ayarlamak için aynı dosyaya aşağıdakileri ekleyin:
module.exports = (passport) => {
passport.use(
”local-signup”,
new LocalStrategy(
{
usernameField: “email”,
passwordField: “password”,
},
async (email, password, done) => {
try {
const userExists = await emailExists(email)
if (userExists) {
return done(null, false);
}
const user = await createUser(email, password);
return done(null, user);
} catch (error) {
done(error);
}
}
)
);
}
Yerel pasaport bir kullanıcı adı ve parola beklediğinden ve siz bir e-posta kullandığınızdan, kullanıcı adı alanını bir e-posta olarak ayarlayın. Bu uygulamanın kullanıcı veya daha doğrusu ön uç kısmı, istek gövdesindeki e-postayı ve şifreyi gönderecektir. Ancak, Passport bunu arka planda halledeceği için değerleri kendiniz ayıklamanız gerekmez.
Bu program öncelikle helper.js’den emailExists() işlevini kullanarak e-postanın zaten alınmış olup olmadığını kontrol eder. E-posta veritabanında yoksa, createUser() işleviyle yeni bir kullanıcı oluşturur. Son olarak, kullanıcı nesnesini döndürür.
Kullanıcıların oturum açması için, pasaportConfig.js dosyasına şunu ekleyin:
module.exports = (passport) => {
passport.use(
”local-signup”,
new LocalStrategy(
// sign up
)
);
passport.use(
”local-login”,
new LocalStrategy(
{
usernameField: “email”,
passwordField: “password”,
},
async (email, password, done) => {
try {
const user = await emailExists(email);
if (!user) return done(null, false);
const isMatch = await matchPassword(password, user.password);
if (!isMatch) return done(null, false);
return done(null, {id: user.id, email: user.email});
} catch (error) {
return done(error, false);
}
}
)
);
};
Burada program öncelikle e-postanın kayıtlı olup olmadığını kontrol eder. Değilse, false döndürür. E-postayı bulursa, parolasını istektekiyle karşılaştırır. Parolalar eşleşirse, kullanıcının oturumunu açar ve kullanıcı nesnesini döndürür.
Son adım, API uç noktalarını oluşturmaktır:
POST / yetkilendirme/kayıt
POST / yetkilendirme / giriş
Bu uç noktaların her ikisi de istek gövdesinde bir e-posta ve parola alacaktır. Ayrıca az önce yapılandırdığımız pasaport kimlik doğrulama ara yazılımı işlevlerini de içerecekler.
Passport’u server.js adlı yeni bir dosyaya aktarın ve kurun :
const passport = require(“passport”);
require(“./passportConfig”)(passport);
Ardından, aşağıdaki rotaları ekleyin:
app.post(
“/auth/signup”,
passport.authenticate(“local-signup”, { session: false }),
(req, res, next) => {
res.json({
user: req.user,
});
}
);
app.post(
“/auth/login”,
passport.authenticate(“local-login”, { session: false }),
(req, res, next) => {
res.json({ user: req.user });
}
);
Bu yolların her ikisi de başarılı olursa kullanıcıyı içeren bir JSON nesnesi döndürür.
Birim Testlerini Kullanarak API’nizi Kontrol Edin
PostgreSQL uygulaması kullanarak bir Düğüm uygulamasının kimliğini doğrulamak için Passport’u kullanabilirsiniz. Kullanıcıların kaydolması ve oturum açması için API uç noktaları oluşturdunuz.
Bir API’nin ne kadar iyi çalıştığını test etmek için Postman gibi REST istemcilerini kullanabilirsiniz, ancak birim testleri yazmak çok daha basittir. Birim testleri, uygulamanızın ayrı bölümlerini test etmenize olanak tanır. Bu şekilde, bir uç nokta başarısız olsa bile, tam olarak arıza noktasını belirleyebilirsiniz. Node uygulamalarını test etmek için kullanabileceğiniz araçlardan biri de Jest’tir.