Bir geliştirici olarak, kullanıcılarınızın verilerini kimlik doğrulama yoluyla korumak sizin sorumluluğunuzdadır. Bir Node 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ç noktalara sahip bir Düğüm sunucusu oluşturarak başlayın. Uygulamanıza yetkisiz erişimi kısıtlamak için kimlik doğrulamayı Passport'a bırakabilirsiniz.

Kullanıcı Tablosu Oluşturma

Kullanıcı kimlik doğrulaması için bir e-posta ve bir şifre kullanacaksınız. Bu, kullanıcılar tablosunun bir e-posta ve bir şifre alanı içermesi gerektiği anlamına gelir. psql komut isteminde nodeapp adında yeni bir veritabanı oluşturun:

OLUŞTURMAKVERİ TABANI düğüm uygulaması;

Ardından, kullanıcıları depolamak için bir tablo oluşturun:

OLUŞTURMAKMASAkullanıcılar (
id INT GENERATED HER ZAMAN KİMLİK BİRİNCİL ANAHTARI OLARAK,
e-posta CHAR(128),
şifre CHAR(60)
);

Bu kod, e-posta, şifre ve otomatik olarak oluşturulmuş bir kimlik alanı içeren yeni bir tablo oluşturacaktır.

instagram viewer

Düğüm Sunucusu Oluşturma

Node.js, HTTP sunucularını hızlı bir şekilde oluşturmamızı sağlayan, sunucu taraflı bir JavaScript çalışma zamanı ortamıdır. Sunucu ve farklı HTTP yolları oluşturma sürecini basitleştirmek için şunları kullanabilirsiniz: Express, bir Node.js web çerçevesi.

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 başlangıç ​​-y

Son olarak, Express'i yükleyin:

npm ekspres yükleme

Şimdi yapabilirsin düğüm web sunucusunu oluştur.

adlı yeni bir dosyada index.js, şunları ekleyin:

const ifade = gerekmek("ifade etmek");
const uygulama = ekspres();
app.use (express.json());
app.use (express.urlencoded({ Genişletilmiş: doğru }));
uygulama.dinle(3000, () => konsol.log("Portta dinleme 3000"));

Bu kodu çalıştırmak sunucuyu başlatacak ve konsolda aşağıdakileri günlüğe kaydedecektir:

3000 numaralı bağlantı noktasında dinleme

PostgreSQL'e bağlanma

İle PostgreSQL'e bağlan kullanmak düğüm-postgres. node-postgres, Node ve Postgres arasında bir arayüz sağlayan bir bağlantı sürücüsüdür.

Node-postrges'i npm yoluyla kurmak için aşağıdakileri yürütün:

npm kurulum sayfası

Bu kitaplığı yükledikten sonra, adlı yeni bir dosya oluşturun. db.js ve veritabanına bağlayın:

const { Müşteri } = gerekmek("pg");
const { kullanıcı, ana bilgisayar, veritabanı, parola, bağlantı noktası } = gerekmek("./dbConfig");

const müşteri = yeni Müşteri({
kullanıcı
ev sahibi,
veri tabanı,
şifre,
Liman,
});

istemci.bağlantı();
modül.exports = müşteri;

node-postgres'deki istemci yöntemi, bağlandığınız veritabanının ayrıntılarını alır. Bu program, bağlantı ayrıntılarını adlı bir dosyadan içe aktarır. dbConfig. Bu nedenle, bu dosyayı oluşturun ve ona aşağıdaki kodu ekleyin:

modül.ihracat = {
kullanıcı: "postgres",
ana bilgisayar: "yerel ana bilgisayar",
veritabanı: "nodeapp",
şifre: "Parolanız",
Liman: 5432,
};

Veritabanı Yardımcı İşlevleri Oluşturun

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 bitiş noktası için iki işlev oluşturmanız gerekir:

  1. E-postanın zaten kayıtlı olup olmadığını kontrol etmek için.
  2. Kullanıcıyı oluşturmak için.

Amaç, yalnızca veritabanında yoksa bir kullanıcıyı kaydetmektir.

adlı yeni bir dosya oluşturun. helper.js ve veritabanı istemcisini db.js'den içe aktarın:

const müşteri = gerekmek("./db.js")

Ardından, emailExists() adlı yeni bir işlev ekleyin:

const e-postaMevcut = zaman uyumsuz (e-posta) => {
const veri = beklemek client.query("SEÇ * KULLANICILARDAN NEREDE e-posta=$1", [
e-posta,
]);

eğer (data.rowCount == 0) dönüşyanlış;
dönüş veri.satırlar[0];
};

Bu işlev bir e-posta alır ve zaten kullanımda olup olmadığını kontrol eder. Bunu, kaydolan 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'ye createUser() adlı bir işlev ekleyin:

const oluşturKullanıcı = zaman uyumsuz (e-posta, şifre) => {
const tuz = beklemek bcrypt.genTuz(10);
const karma = beklemek bcrypt.hash (şifre, tuz);

const veri = beklemek müşteri.sorgu(
"INSERT INTO kullanıcılara (e-posta, şifre) DEĞERLER ($1, $2) DÖNÜŞ id, e-posta, şifre",
[e-posta, karma]
);

eğer (data.rowCount == 0) dönüşyanlış;
dönüş veri.satırlar[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ı kaydetmeden önce şunları yapmanız gerektiğini unutmayın. bcrypt kullanarak hash edin. Parolaları düz metin olarak saklamak asla iyi bir fikir değildir. Bilgisayar korsanları kullanıcı veritabanınıza erişebilseydi, hassas bilgilere kolayca erişebilirlerdi.

Kullanmaya başlamak için bcryptjs yükleyin:

npm bcryptjs'yi kurun

helper.js'de bcryptjs'yi içe aktarın:

const şifre = gerekmek("bcryptjs")

Bcryptjs kullanıldığında, veritabanı yalnızca şifrelenmiş parolayı depolar. Bu nedenle, oturum açma sırasında, kullanıcı tarafından verilen düz metin şifre ile veritabanındaki karma ş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 maçŞifre = zaman uyumsuz (şifre, hashPassword) => {
const maç = beklemek bcrypt.compare (şifre, hashPassword);
dönüş kibrit
};

Düz parolayı ve karma değerini alır ve ardından sağlanan parolanın doğru olup olmadığını belirlemek için Bcrypt.compare() öğesini kullanır. Eğer öyleyse true, değilse 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:

modül.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 yerel pasaportu yüklemek için aşağıdaki komutu kullanın:

npm kurulum pasaportu
npm pasaport yerel kurulum

Ardından, mevcut kullanıcılarda oturum açmak ve yeni kullanıcıları kaydetmek için Passport'u yapılandırın.

Yeni bir dosya oluşturarak başlayın pasaportConfig.js. Ardından, Passport yerel stratejisini ve az önce oluşturduğunuz veritabanı yardımcı işlevlerini içe aktarın:

const YerelStrateji = gerekmek("pasaport-yerel");
const { emailExists, createUser, matchPassword } = gerekmek("./yardımcı");

Kullanıcı kaydını ayarlamak için aynı dosyaya aşağıdakileri ekleyin:

modül.exports = (pasaport) => {
pasaport.use(
"yerel kayıt",
yeni YerelStrateji(
{
usernameField: "e-posta",
passwordField: "parola",
},
zaman uyumsuz (e-posta, şifre, bitti) => {
denemek {
const userExists = beklemek e-postaVar (e-posta)

eğer (kullanıcıVar) {
dönüş tamamlamak(hükümsüz, yanlış);
}

const kullanıcı = beklemek createUser (e-posta, şifre);
dönüş tamamlamak(hükümsüz, kullanıcı);
} tutmak (hata) {
yapıldı (hata);
}
}
)
);
}

Pasaport-yerel bir kullanıcı adı ve şifre beklediğinden ve bir e-posta kullandığınızdan, kullanıcı adı alanını bir e-posta olarak ayarlayın. Kullanıcı veya daha doğrusu bu uygulamanın ön uç kısmı, istek gövdesinde e-posta ve şifreyi gönderecektir. Ancak, Passport bunu arka planda halledeceği için değerleri kendiniz çıkarmanız gerekmez.

Bu program önce e-postanın helper.js'den emailExists() işlevi kullanılarak alınıp alınmadığı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ılara giriş yapmak için, pasaportConfig.js'ye aşağıdakileri ekleyin:

modül.exports = (pasaport) => {
pasaport.use(
"yerel kayıt",
yeni YerelStrateji(
// üye olmak
)
);
pasaport.use(
"yerel giriş",
yeni YerelStrateji(
{
usernameField: "e-posta",
passwordField: "parola",
},
zaman uyumsuz (e-posta, şifre, bitti) => {
denemek {
const kullanıcı = beklemek emailExists (e-posta);
eğer (!kullanıcı) dönüş tamamlamak(hükümsüz, yanlış);
const isMatch = beklemek matchPassword (şifre, kullanıcı.şifre);
eğer (!isMatch) dönüş tamamlamak(hükümsüz, yanlış);
dönüş tamamlamak(hükümsüz, {İD: Kullanıcı kimliği, e-posta: Kullanıcı e-postası});
} tutmak (hata) {
dönüş yapıldı (hata, yanlış);
}
}
)
);
};

Burada program önce e-postanın kayıtlı olup olmadığını kontrol eder. Değilse, false döndürür. E-postayı bulursa, şifresini istekteki şifreyle 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/auth/kayıt
  • POST /auth/giriş

Bu uç noktaların her ikisi de istek gövdesinde bir e-posta ve şifre 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 adlı yeni bir dosyada içe aktarın ve ayarlayın server.js:

const pasaport = gerekmek("pasaport");
gerekmek("./passportConfig")(pasaport);

Ardından, aşağıdaki yolları ekleyin:

uygulama.post(
"/auth/üye olmak",
pasaport.authenticate("yerel kayıt", { oturum: yanlış }),
(req, res, sonraki) => {
res.json({
kullanıcı: req.user,
});
}
);
uygulama.post(
"/auth/giriş yapmak",
pasaport.authenticate("yerel giriş", { oturum: yanlış }),
(req, res, sonraki) => {
res.json({ kullanıcı: gerekli kullanıcı });
}
);

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

Bir PostgreSQL uygulaması kullanarak bir Düğüm uygulamasının kimliğini doğrulamak için Passport'u kullanabilirsiniz. Kullanıcılara kaydolmak ve oturum açmak 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 kolaydır. Birim testleri, uygulamanızın tek tek bölümlerini test etmenize olanak tanır. Bu şekilde, bir uç nokta başarısız olsa bile, kesin hata noktasını belirleyebilirsiniz. Düğüm uygulamalarını test etmek için kullanabileceğiniz araçlardan biri Jest'tir.