Kehittäjänä sinun vastuullasi on suojata käyttäjiesi tiedot todennuksen avulla. Passport.js: n avulla voit todentaa käyttäjiä Node- ja Postgres-sovelluksissa.

Aloita luomalla solmupalvelin, jossa on päätepisteitä käyttäjien rekisteröintiä, sisäänkirjautumista ja uloskirjautumista varten. Voit antaa Passportin käsitellä todennusta estääksesi luvattoman pääsyn sovellukseesi.

Käyttäjätaulukon luominen

Käyttäjien todentamiseen käytetään sähköpostiosoitetta ja salasanaa. Tämä tarkoittaa, että käyttäjätaulukon tulee sisältää sähköpostiosoite ja salasanakenttä. Luo psql-komentokehotteessa uusi tietokanta nimeltä nodeapp:

LUODATIETOKANTA nodeapp;

Luo seuraavaksi taulukko käyttäjien tallentamiseksi:

LUODAPÖYTÄkäyttäjiä (
ID INT LUODATUA AINA TUNNISTUKSEN ENSISIJAISENA AVAINNA,
sähköposti CHAR(128),
salasana CHAR(60)
);

Tämä koodi luo uuden taulukon, joka sisältää sähköpostiosoitteen, salasanan ja automaattisesti luodun tunnuskentän.

Solmupalvelimen luominen

Node.js on palvelinpuolen JavaScript-ajonaikainen ympäristö, jonka avulla voimme luoda HTTP-palvelimia nopeasti. Palvelimen ja eri HTTP-reittien luomisprosessin yksinkertaistamiseksi voit käyttää

Express, Node.js-verkkokehys.

Suorita tämä komento luodaksesi uuden kansion nimeltä postgres-auth:

mkdir postgres-auth

Alusta seuraavaksi npm:

npm init -y

Asenna lopuksi Express:

npm install express

Nyt voit Luo Node-verkkopalvelin.

Uudessa tiedostossa nimeltä index.js, lisää seuraavat:

konst express = vaatia("ilmaista");
konst sovellus = express();
app.use (express.json());
app.use (express.urlencoded({ laajennettu: totta }));
app.listen(3000, () => konsoli.log("Kuuntelee portissa 3000"));

Tämän koodin suorittaminen käynnistää palvelimen ja kirjaa seuraavat tiedot konsoliin:

Kuuntele portti 3000

Yhdistetään PostgreSQL: ään

Vastaanottaja muodostaa yhteyden PostgreSQL: ään käyttää solmu-postgres. node-postgres on yhteysohjain, joka tarjoaa liitännän Noden ja Postgresin välille.

Suorita seuraava asentaaksesi node-postrges npm: n kautta:

npm asennus pg

Kun olet asentanut kirjaston, luo uusi tiedosto nimeltä db.js ja liitä se tietokantaan:

konst { Asiakas } = vaatia("pg");
konst { käyttäjä, isäntä, tietokanta, salasana, portti } = vaatia(./dbConfig");

konst asiakas = Uusi Asiakas({
käyttäjä,
isäntä,
tietokanta,
Salasana,
satama,
});

client.connect();
moduuli.exports = asiakas;

Asiakasmenetelmä node-postgresista ottaa sen tietokannan tiedot, johon muodostat yhteyden. Tämä ohjelma tuo yhteystiedot tiedostosta nimeltä dbConfig. Siksi luo kyseinen tiedosto ja lisää siihen seuraava koodi:

moduuli.exports = {
käyttäjä: "postgres",
isäntä: "localhost",
tietokanta: "nodeapp",
salasana: "yourPassword",
portti: 5432,
};

Luo tietokannan aputoimintoja

On aina hyvä käytäntö käyttää yksittäisiä toimintoja vuorovaikutuksessa tietokannan kanssa. Ne helpottavat yksikkötestien kirjoittamista ja parantavat uudelleenkäytettävyyttä. Kirjautumisen päätepistettä varten sinun on luotava kaksi funktiota:

  1. Tarkistaaksesi, onko sähköposti jo rekisteröity.
  2. Luodaksesi käyttäjän.

Tavoitteena on rekisteröidä käyttäjä vain, jos häntä ei ole tietokannassa.

Luo uusi tiedosto nimeltä helper.js ja tuo tietokantaasiakasohjelma db.js: sta:

konst asiakas = vaatia(./db.js")

Lisää seuraavaksi uusi funktio nimeltä emailExists():

konst emailExists = asynk (sähköposti) => {
konst data = odottaa client.query("SELECT * FROM käyttäjiltä WHERE email=$1", [
sähköposti,
]);

jos (data.rowCount == 0) palataväärä;
palata data.rows[0];
};

Tämä toiminto ottaa sähköpostin ja tarkistaa, onko se jo käytössä. Se tekee tämän käyttämällä SELECT-lausetta, joka palauttaa rivin, jonka sähköpostikenttä vastaa rekisteröityvän käyttäjän antamaa arvoa. Jos sähköpostia ei ole olemassa, se palauttaa false.

Jos haluat luoda funktion, joka luo käyttäjän, lisää funktio nimeltä createUser() helper.js-tiedostoon:

konst createUser = asynk (sähköposti, salasana) => {
konst suola = odottaa bcrypt.genSalt(10);
konst hash = odottaa bcrypt.hash (salasana, suola);

konst data = odottaa client.query(
"INSERT INTO käyttäjiin (sähköposti, salasana) ARVOT ($1, $2) PALAUTTAMINEN ID, sähköpostiosoite, salasana",
[sähköposti, hash]
);

jos (data.rowCount == 0) palataväärä;
palata data.rows[0];
};

Tämä toiminto ottaa sähköpostin ja salasanan arvot. Se käyttää INSERT-lausetta uuden rivin luomiseen näillä tiedoilla ja palauttaa äskettäin luodun käyttäjän, jos se onnistuu. Huomaa, että sinun tulee ennen salasanan tallentamista hash se bcryptillä. Ei ole koskaan hyvä idea tallentaa salasanoja pelkkänä tekstinä. Jos hakkerit pääsisivät käyttäjätietokantaasi, he voivat helposti päästä käsiksi arkaluontoisiin tietoihin.

Asenna bcryptjs aloittaaksesi sen käytön:

npm asenna bcryptjs

Tuo bcryptjs: ssä helper.js:

konst bcrypt = vaatia("bcryptjs")

Bcryptjs: iä käyttämällä tietokanta tallentaa vain salatun salasanan. Siksi kirjautumisen aikana sinun on verrattava käyttäjän antamaa pelkkä teksti -salasanaa tietokannassa olevaan hajautettuun salasanaan. Tätä varten voit käyttää Bcryptjs: n tarjoamaa vertailumenetelmää.

Luo funktio nimeltä matchPassword():

konst matchPassword = asynk (salasana, hashPassword) => {
konst ottelu = odottaa bcrypt.compare (salasana, hashPassword);
palata ottelu
};

Se vastaanottaa tavallisen salasanan ja tiivisteen ja käyttää sitten Bcrypt.compare()-komentoa määrittääkseen, onko annettu salasana oikea. Jos on, se palauttaa tosi, muuten se palauttaa epätosi.

Nämä ovat kaikki toiminnot, joita käytämme vuorovaikutuksessa tietokannan kanssa. Muista viedä ne kaikki lopussa:

moduuli.exports = { emailExists, createUser, matchPassword };

Määritä Passport

Passport on Node-todennusväliohjelmisto, joka tarjoaa yli 500 todennusstrategiaa, kuten sosiaalinen kirjautuminen, JSON Web Tokens (JWT) ja sähköpostitodennuksen. Käytämme jälkimmäistä, jonka passi-paikallinen strategia tarjoaa.

Asenna passi ja passi-local käyttämällä seuraavaa komentoa:

npm asennuspassi
npm asennus passi-paikallinen

Määritä seuraavaksi Passport kirjautumaan olemassa oleviin käyttäjiin ja rekisteröimään uusia käyttäjiä.

Aloita luomalla uusi tiedosto passportConfig.js. Tuo sitten Passportin paikallinen strategia ja juuri luomasi tietokannan aputoiminnot:

konst Paikallinen strategia = vaatia("paikallinen passi");
konst { emailExists, createUser, matchPassword } = vaatia("./auttaja");

Lisää samaan tiedostoon seuraavat määrittämään käyttäjän kirjautuminen:

moduuli.exports = (passi) => {
pass.use(
"paikallinen kirjautuminen",
Uusi LocalStrategy(
{
usernameField: "email",
passwordField: "salasana",
},
asynk (sähköposti, salasana, valmis) => {
yrittää {
konst userExists = odottaa emailExists (sähköposti)

jos (userExists) {
palata tehty(tyhjä, väärä);
}

konst käyttäjä = odottaa createUser (sähköposti, salasana);
palata tehty(tyhjä, käyttäjä);
} ottaa kiinni (virhe) {
tehty (virhe);
}
}
)
);
}

Koska Passport-local odottaa käyttäjätunnusta ja salasanaa ja käytät sähköpostia, aseta käyttäjätunnuskenttään sähköposti. Käyttäjä tai pikemminkin tämän sovelluksen käyttöliittymä lähettää sähköpostin ja salasanan pyynnön tekstiosassa. Sinun ei kuitenkaan tarvitse poimia arvoja itse, sillä Passport hoitaa sen taustalla.

Tämä ohjelma tarkistaa ensin, onko sähköposti jo otettu käyttämällä emailExists()-funktiota helper.js: stä. Jos sähköpostia ei ole tietokannassa, se luo uuden käyttäjän createUser()-funktiolla. Lopuksi se palauttaa käyttäjäobjektin.

Jos haluat kirjautua sisään, lisää seuraava passportConfig.js-tiedostoon:

moduuli.exports = (passi) => {
pass.use(
"paikallinen kirjautuminen",
Uusi LocalStrategy(
// Kirjaudu
)
);
pass.use(
"paikallinen kirjautuminen",
Uusi LocalStrategy(
{
usernameField: "email",
passwordField: "salasana",
},
asynk (sähköposti, salasana, valmis) => {
yrittää {
konst käyttäjä = odottaa emailExists (sähköposti);
jos (!käyttäjä) palata tehty(tyhjä, väärä);
konst isMatch = odottaa matchPassword (salasana, käyttäjä.salasana);
jos (!isMatch) palata tehty(tyhjä, väärä);
palata tehty(tyhjä, {id: käyttäjätunnus, sähköposti: user.email});
} ottaa kiinni (virhe) {
palata tehty (virhe, väärä);
}
}
)
);
};

Tässä ohjelma tarkistaa ensin, onko sähköposti rekisteröity. Jos ei, se palauttaa epätosi. Jos se löytää sähköpostin, se vertaa salasanaansa pyynnön salasanaan. Jos salasanat täsmäävät, se kirjautuu sisään käyttäjän sisään ja palauttaa käyttäjäobjektin.

Viimeinen vaihe on API-päätepisteiden luominen:

  • POST /auth/signup
  • POST /auth/login

Molemmat päätepisteet saavat sähköpostin ja salasanan pyynnön tekstiosassa. Ne sisältävät myös juuri määrittämämme passin todentamisen väliohjelmistotoiminnot.

Tuo ja määritä Passport uuteen tiedostoon nimeltä server.js:

konst passi = vaatia("passi");
vaatia(./passportConfig")(passi);

Lisää sitten seuraavat reitit:

app.post(
"/auth/Kirjaudu",
passport.authenticate("local-signup", { istunto: väärä }),
(req, res, next) => {
res.json({
käyttäjä: req.user,
});
}
);
app.post(
"/auth/Kirjaudu sisään",
passport.authenticate("local-login", { istunto: väärä }),
(req, res, next) => {
res.json({ käyttäjä: req.user });
}
);

Molemmat reitit palauttavat käyttäjän sisältävän JSON-objektin, jos se onnistuu.

Tarkista sovellusliittymäsi yksikkötesteillä

Passportin avulla voit todentaa Node-sovelluksen käyttämällä PostgreSQL-sovellusta. Loit API-päätepisteitä käyttäjien rekisteröitymistä ja sisäänkirjautumista varten.

Vaikka voit käyttää REST-asiakkaita, kuten Postmania, testata API: n toimivuutta, mutta yksikkötestien kirjoittaminen on paljon yksinkertaisempaa. Yksikkötesteillä voit testata sovelluksesi yksittäisiä osia. Tällä tavalla, vaikka päätepiste epäonnistuu, voit määrittää tarkan virhekohdan. Yksi työkaluista, joita voit käyttää Node-sovellusten testaamiseen, on Jest.