Als ontwikkelaar is het uw verantwoordelijkheid om de gegevens van uw gebruikers te beschermen door middel van authenticatie. U kunt Passport.js gebruiken om gebruikers te verifiëren in een Node- en Postgres-toepassing.

Begin met het maken van een Node-server met eindpunten om gebruikers te registreren, aan te melden en uit te loggen. U kunt Passport de authenticatie laten afhandelen om ongeautoriseerde toegang tot uw applicatie te beperken.

Een gebruikerstabel maken

Voor gebruikersauthenticatie gebruikt u een e-mailadres en een wachtwoord. Dit betekent dat de gebruikerstabel een e-mailadres en een wachtwoordveld moet bevatten. Maak in de psql-opdrachtprompt een nieuwe database met de naam nodeapp:

CREËRENDATABASE node-app;

Maak vervolgens een tabel om de gebruikers op te slaan:

CREËRENTAFELgebruikers (
id INT ALTIJD GEGENEREERD ALS PRIMAIRE IDENTITEITSSLEUTEL,
e-mail CHAR(128),
wachtwoord CHAR(60)
);

Met deze code wordt een nieuwe tabel gemaakt met e-mailadres, wachtwoord en een automatisch gegenereerd ID-veld.

Een knooppuntserver maken

Node.js is een server-side JavaScript runtime-omgeving waarmee we snel HTTP-servers kunnen maken. Om het proces van het maken van de server en verschillende HTTP-routes te vereenvoudigen, kunt u gebruik maken van: Express, een Node.js-webframework.

Voer deze opdracht uit om een ​​nieuwe map met de naam postgres-auth te maken:

mkdir postgres-auth

Initialiseer vervolgens npm:

npm init -y

Installeer tot slot Express:

npm install express

Je kan nu maak de Node-webserver.

In een nieuw bestand genaamd index.js, voeg het volgende toe:

const express = vereisen("uitdrukken");
const app = express();
app.gebruik (express.json());
app.gebruik (express.urlencoded({ verlengd: WAAR }));
app.luisteren(3000, () => troosten.log("Luisteren op poort 3000"));

Als u deze code uitvoert, wordt de server gestart en wordt het volgende in de console vastgelegd:

Luisteren op poort 3000

Verbinding maken met PostgreSQL

Tot verbinding maken met PostgreSQL gebruiken node-postgres. node-postgres is een verbindingsstuurprogramma dat een interface biedt tussen Node en Postgres.

Voer het volgende uit om node-postrges via npm te installeren:

npm installeren pg

Nadat je die bibliotheek hebt geïnstalleerd, maak je een nieuw bestand met de naam db.js en verbind het met de database:

const { Klant } = vereisen("pag");
const { gebruiker, host, database, wachtwoord, poort } = vereisen("./dbConfig");

const klant = nieuwe Cliënt({
gebruiker,
gastheer,
databank,
wachtwoord,
haven,
});

cliënt.connect();
module.export = klant;

De clientmethode van node-postgre neemt de details van de database waarmee u verbinding maakt. Dit programma importeert de verbindingsdetails uit een bestand genaamd dbConfig. Maak daarom dat bestand aan en voeg er de volgende code aan toe:

module.export = {
gebruiker: "postgres",
host: "lokale host",
database: "nodeapp",
wachtwoord: "uwWachtwoord",
haven: 5432,
};

Databasehulpfuncties maken

Het is altijd een goede gewoonte om afzonderlijke functies te gebruiken voor interactie met de database. Ze maken het gemakkelijk om unit-tests te schrijven en verbeteren de herbruikbaarheid. Voor het aanmeldingseindpunt moet u twee functies maken:

  1. Om te controleren of de e-mail al is geregistreerd.
  2. Om de gebruiker aan te maken.

Het doel is om alleen een gebruiker te registreren als deze niet in de database bestaat.

Maak een nieuw bestand met de naam helper.js en importeer de databaseclient van db.js:

const klant = vereisen("./db.js")

Voeg vervolgens een nieuwe functie toe met de naam emailExists():

const emailBestaat = asynchrone (e-mail) => {
const gegevens = wachten client.query("SELECT * FROM gebruikers WHERE email=$1", [
e-mail,
]);

als (data.rowCount == 0) opbrengstvals;
opbrengst data.rijen[0];
};

Deze functie neemt een e-mail en controleert of deze al in gebruik is. Het doet dit door de SELECT-component te gebruiken die een rij retourneert met een e-mailveld dat overeenkomt met de waarde die is opgegeven door de registrerende gebruiker. Als de e-mail niet bestaat, wordt false geretourneerd.

Om een ​​functie te maken die de gebruiker aanmaakt, voegt u een functie genaamd createUser() toe aan helper.js:

const createUser = asynchrone (e-mail, wachtwoord) => {
const zout = wachten bcrypt.genSalt(10);
const hash = wachten bcrypt.hash (wachtwoord, zout);

const gegevens = wachten klant.query(
"INSERT INTO gebruikers (e-mail, wachtwoord) WAARDEN ($1, $2) RETOUR-ID, e-mail, wachtwoord",
[e-mail, hash]
);

als (data.rowCount == 0) opbrengstvals;
opbrengst data.rijen[0];
};

Deze functie neemt de e-mail- en wachtwoordwaarden. Het gebruikt de INSERT-component om een ​​nieuwe rij met deze details te maken en indien succesvol wordt de nieuw aangemaakte gebruiker geretourneerd. Merk op dat voordat u het wachtwoord opslaat, u: hash het met behulp van bcrypt. Het is nooit een goed idee om wachtwoorden als platte tekst op te slaan. Als hackers toegang krijgen tot uw gebruikersdatabase, kunnen ze gemakkelijk toegang krijgen tot gevoelige informatie.

Installeer bcryptjs om het te gebruiken:

npm installeer bcryptjs

Importeer in helper.js bcryptjs:

const bcrypt = vereisen("bcryptjs")

Door Bcryptjs te gebruiken, slaat de database alleen het versleutelde wachtwoord op. Daarom moet u tijdens het inloggen het wachtwoord in platte tekst van de gebruiker en het gehashte wachtwoord in de database vergelijken. Hiervoor kunt u de vergelijkingsmethode van Bcryptjs gebruiken.

Maak een functie met de naam matchPassword():

const matchPassword = asynchrone (wachtwoord, hashPassword) => {
const overeenkomen = wachten bcrypt.compare (wachtwoord, hashPassword);
opbrengst wedstrijd
};

Het ontvangt het gewone wachtwoord en de hash en gebruikt vervolgens Bcrypt.compare() om te bepalen of het verstrekte wachtwoord correct is. Als dit het geval is, retourneert het waar, anders wordt het onwaar geretourneerd.

Dit zijn alle functies die we zullen gebruiken om met de database te communiceren. Zorg ervoor dat u ze allemaal aan het einde exporteert:

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

Paspoort configureren

Passport is een node-authenticatie-middleware die meer dan 500 authenticatiestrategieën biedt, zoals social login, JSON Web Tokens (JWT) en e-mailauthenticatie. We zullen de laatste gebruiken die de paspoort-lokale strategie biedt.

Gebruik de volgende opdracht om paspoort en paspoort-lokaal te installeren:

npm paspoort installeren
npm installeer paspoort-lokaal

Configureer vervolgens Passport om bestaande gebruikers in te loggen en nieuwe gebruikers te registreren.

Begin met het maken van een nieuw bestand paspoortConfig.js. Importeer vervolgens de lokale Passport-strategie en de databasehelperfuncties die u zojuist hebt gemaakt:

const Lokale Strategie = vereisen("paspoort-lokaal");
const { emailExists, createUser, matchPassword } = vereisen("./helper");

Voeg in hetzelfde bestand het volgende toe om gebruikersaanmelding in te stellen:

module.exports = (paspoort) => {
paspoort.gebruik(
"lokale aanmelding",
nieuwe Lokale Strategie(
{
gebruikersnaamVeld: "e-mail",
wachtwoordveld: "wachtwoord",
},
asynchrone (e-mail, wachtwoord, klaar) => {
proberen {
const gebruikerBestaat = wachten e-mailBestaat (e-mail)

als (gebruiker bestaat) {
opbrengst gedaan(nul, vals);
}

const gebruiker = wachten createUser (e-mail, wachtwoord);
opbrengst gedaan(nul, gebruiker);
} vangst (fout) {
gedaan (fout);
}
}
)
);
}

Aangezien paspoort-local een gebruikersnaam en een wachtwoord verwacht en u een e-mail gebruikt, stelt u het veld gebruikersnaam in op een e-mail. De gebruiker of liever het frontend-gedeelte van deze applicatie stuurt de e-mail en het wachtwoord in de aanvraagtekst. U hoeft de waarden echter niet zelf te extraheren, aangezien Passport dat op de achtergrond afhandelt.

Dit programma controleert eerst of de e-mail al in gebruik is met de functie emailExists() van helper.js. Als de e-mail niet in de database bestaat, wordt een nieuwe gebruiker gemaakt met de functie createUser(). Ten slotte retourneert het het gebruikersobject.

Om gebruikers aan te melden, voegt u het volgende toe aan paspoortConfig.js:

module.exports = (paspoort) => {
paspoort.gebruik(
"lokale aanmelding",
nieuwe Lokale Strategie(
// aanmelden
)
);
paspoort.gebruik(
"lokale login",
nieuwe Lokale Strategie(
{
gebruikersnaamVeld: "e-mail",
wachtwoordveld: "wachtwoord",
},
asynchrone (e-mail, wachtwoord, klaar) => {
proberen {
const gebruiker = wachten emailBestaat (e-mail);
als (!gebruiker) opbrengst gedaan(nul, vals);
const isMatch = wachten matchPassword (wachtwoord, gebruiker.wachtwoord);
als (!isMatch) opbrengst gedaan(nul, vals);
opbrengst gedaan(nul, {ID kaart: gebruikersnaam, e-mail: gebruiker.e-mail});
} vangst (fout) {
opbrengst gedaan (fout, vals);
}
}
)
);
};

Hier controleert het programma eerst of de e-mail is geregistreerd. Zo niet, dan wordt false geretourneerd. Als het de e-mail vindt, vergelijkt het zijn wachtwoord met dat van het verzoek. Als de wachtwoorden overeenkomen, wordt de gebruiker aangemeld en wordt het gebruikersobject geretourneerd.

De laatste stap is het maken van de API-eindpunten:

  • POST /auth/aanmelden
  • POST /auth/login

Beide eindpunten ontvangen een e-mail en wachtwoord in de hoofdtekst van het verzoek. Ze zullen ook de middleware-functies voor paspoortverificatie bevatten die we zojuist hebben geconfigureerd.

Paspoort importeren en instellen in een nieuw bestand met de naam server.js:

const paspoort = vereisen("paspoort");
vereisen("./passportConfig") (paspoort);

Voeg vervolgens de volgende routes toe:

app.post(
"/auth/aanmelden",
paspoort.authenticate("lokale aanmelding", { sessie: vals }),
(req, res, volgende) => {
res.json({
gebruiker: verzoek.gebruiker,
});
}
);
app.post(
"/auth/Log in",
paspoort.authenticate("local-login", { sessie: vals }),
(req, res, volgende) => {
res.json({ gebruiker: verzoek.gebruiker });
}
);

Beide routes retourneren een JSON-object met de gebruiker als dit is gelukt.

Controleer uw API met behulp van eenheidstests

U kunt Passport gebruiken om een ​​Node-toepassing te verifiëren met behulp van een PostgreSQL-toepassing. U hebt API-eindpunten gemaakt om gebruikers aan te melden en in te loggen.

Hoewel je REST-clients zoals Postman kunt gebruiken om te testen hoe goed een API werkt, is het schrijven van unit-tests veel eenvoudiger. Met unittests kunt u de afzonderlijke onderdelen van uw toepassing testen. Op deze manier kunt u, zelfs als een eindpunt faalt, het exacte faalpunt lokaliseren. Een van de tools die u kunt gebruiken om Node-toepassingen te testen, is Jest.