Ako vývojár je vašou zodpovednosťou chrániť údaje používateľov prostredníctvom autentifikácie. Passport.js môžete použiť na autentifikáciu používateľov v aplikácii Node a Postgres.

Začnite vytvorením servera Node s koncovými bodmi na registráciu, prihlásenie a odhlásenie používateľov. Passport môžete nechať spracovať autentifikáciu, aby ste obmedzili neoprávnený prístup k vašej aplikácii.

Vytvorenie tabuľky používateľov

Na overenie používateľa budete používať e-mail a heslo. To znamená, že tabuľka používateľov musí obsahovať pole pre e-mail a heslo. V príkazovom riadku psql vytvorte novú databázu s názvom nodeapp:

VYTVORIŤDATABÁZA nodeapp;

Ďalej vytvorte tabuľku na uloženie používateľov:

VYTVORIŤTABLEpoužívateľov (
id INT GENEROVANÉ VŽDY AKO PRIMÁRNY KĽÚČ IDENTITY,
e-mail CHAR(128),
heslo CHAR(60)
);

Tento kód vytvorí novú tabuľku obsahujúcu e-mail, heslo a automaticky vygenerované pole ID.

Vytvorenie servera uzlov

Node.js je runtime prostredie JavaScript na strane servera, ktoré nám umožňuje rýchlo vytvárať servery HTTP. Na zjednodušenie procesu vytvárania servera a rôznych trás HTTP môžete použiť

instagram viewer
Express, webový rámec Node.js.

Spustite tento príkaz na vytvorenie nového priečinka s názvom postgres-auth:

mkdir postgres-auth

Ďalej inicializujte npm:

npm init -y

Nakoniec nainštalujte Express:

npm install express

Teraz môžeš vytvorte webový server Node.

V novom súbore s názvom index.js, pridajte nasledovné:

konšt vyjadriť = vyžadovať("expresné");
konšt app = express();
app.use (express.json());
app.use (express.urlencoded({ predĺžený: pravda }));
app.listen(3000, () => konzoly.log("Počúvanie na porte 3000"));

Spustenie tohto kódu spustí server a do konzoly zaznamená nasledovné:

Počúvanie na porte 3000

Pripojenie k PostgreSQL

Komu pripojiť sa k PostgreSQL použitie node-postgres. node-postgres je ovládač pripojenia, ktorý poskytuje rozhranie medzi Node a Postgres.

Ak chcete nainštalovať node-postrges cez npm, vykonajte nasledovné:

npm inštalácia str

Po nainštalovaní knižnice vytvorte nový súbor s názvom db.js a pripojte ho k databáze:

konšt { Klient } = vyžadovať("pg");
konšt { používateľ, hostiteľ, databáza, heslo, port } = vyžadovať(./dbConfig");

konšt klient = Nový Zákazník({
užívateľ,
hostiteľ,
databáza,
heslo,
prístav,
});

client.connect();
modul.export = klient;

Metóda klienta z node-postgres preberá podrobnosti o databáze, ku ktorej sa pripájate. Tento program importuje podrobnosti o pripojení zo súboru s názvom dbConfig. Preto vytvorte tento súbor a pridajte doň nasledujúci kód:

modul.exports = {
užívateľ: "postgres",
hostiteľ: "localhost",
databáza: "nodeapp",
heslo: "vaše heslo",
port: 5432,
};

Vytvorte pomocné funkcie databázy

Vždy je dobrým zvykom používať jednotlivé funkcie na interakciu s databázou. Uľahčujú písanie jednotkových testov a zlepšujú opätovnú použiteľnosť. Pre koncový bod registrácie musíte vytvoriť dve funkcie:

  1. Ak chcete skontrolovať, či je e-mail už zaregistrovaný.
  2. Na vytvorenie používateľa.

Cieľom je zaregistrovať používateľa, len ak v databáze neexistuje.

Vytvorte nový súbor s názvom helper.js a importujte databázového klienta z db.js:

konšt klient = vyžadovať(./db.js")

Ďalej pridajte novú funkciu s názvom emailExists():

konšt emailExists = async (e-mail) => {
konšt údaje = čakať client.query("SELECT * FROM users WHERE email=$1", [
email,
]);

ak (data.rowCount == 0) vrátiťfalošný;
vrátiť data.rows[0];
};

Táto funkcia prijme e-mail a skontroluje, či sa už používa. Robí to pomocou klauzuly SELECT, ktorá vracia riadok s e-mailovým poľom, ktoré sa zhoduje s hodnotou poskytnutou registrujúcim sa používateľom. Ak e-mail neexistuje, vráti hodnotu false.

Ak chcete vytvoriť funkciu, ktorá vytvorí používateľa, pridajte funkciu s názvom createUser() do súboru helper.js:

konšt createUser = async (e-mail, heslo) => {
konšt soľ = čakať bcrypt.genSalt(10);
konšt hash = čakať bcrypt.hash (heslo, soľ);

konšt údaje = čakať client.query(
"INSERT INTO users (e-mail, heslo) VALUES ($1, $2) VRÁTENIE ID, e-mailu, hesla",
[e-mail, hash]
);

ak (data.rowCount == 0) vrátiťfalošný;
vrátiť data.rows[0];
};

Táto funkcia preberá hodnoty e-mailu a hesla. Používa klauzulu INSERT na vytvorenie nového riadka s týmito podrobnosťami a v prípade úspechu vráti novo vytvoreného používateľa. Upozorňujeme, že pred uložením hesla by ste mali hash to pomocou bcrypt. Nikdy nie je dobrý nápad ukladať heslá ako obyčajný text. Ak hackeri získali prístup k vašej databáze používateľov, mohli by ľahko získať prístup k citlivým informáciám.

Nainštalujte bcryptjs, aby ste ho mohli začať používať:

npm nainštalovať bcryptjs

V helper.js importujte bcryptjs:

konšt bcrypt = vyžadovať("bcryptjs")

Pri použití Bcryptjs databáza ukladá iba zašifrované heslo. Preto počas prihlasovania budete musieť porovnať heslo v obyčajnom texte zadané používateľom a hashované heslo v databáze. Na tento účel môžete použiť metódu porovnania, ktorú poskytuje Bcryptjs.

Vytvorte funkciu s názvom matchPassword():

konšt matchPassword = async (heslo, hashPassword) => {
konšt zápas = čakať bcrypt.compare (heslo, hashPassword);
vrátiť zápas
};

Prijme jednoduché heslo a hash a potom použije Bcrypt.compare() na určenie, či je poskytnuté heslo správne. Ak áno, vráti hodnotu true, inak vráti hodnotu false.

Toto sú všetky funkcie, ktoré použijeme na interakciu s databázou. Nezabudnite ich na konci exportovať všetky:

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

Nakonfigurujte Passport

Passport je middleware na overenie uzlov, ktorý poskytuje viac ako 500 stratégií overovania, ako je sociálne prihlásenie, webové tokeny JSON (JWT) a overovanie e-mailov. Budeme používať to druhé, čo poskytuje pasová-miestna stratégia.

Na inštaláciu passport a passport-local použite nasledujúci príkaz:

npm inštalačný pas
npm install passport-local

Ďalej nakonfigurujte službu Passport na prihlásenie existujúcich používateľov a registráciu nových používateľov.

Začnite vytvorením nového súboru passportConfig.js. Potom importujte lokálnu stratégiu Passport a pomocné funkcie databázy, ktoré ste práve vytvorili:

konšt LocalStrategy = vyžadovať("pas-miestny");
konšt { emailExists, createUser, matchPassword } = vyžadovať(./pomocník");

V tom istom súbore pridajte nasledujúce na nastavenie registrácie používateľa:

modul.exports = (pas) => {
passport.use(
"miestna registrácia",
Nový LocalStrategy(
{
usernameField: "e-mail",
hesloPole: "heslo",
},
async (e-mail, heslo, hotovo) => {
skúste {
konšt userExists = čakať emailExists (e-mail)

ak (userExists) {
vrátiť hotový(nulový, falošný);
}

konšt užívateľ = čakať createUser (e-mail, heslo);
vrátiť hotový(nulový, používateľ);
} chytiť (chyba) {
hotovo (chyba);
}
}
)
);
}

Keďže passport-local očakáva používateľské meno a heslo a vy používate e-mail, nastavte pole používateľského mena na e-mail. Používateľ alebo skôr frontendová časť tejto aplikácie odošle email a heslo v tele žiadosti. Hodnoty však nemusíte extrahovať sami, pretože Passport to zvládne na pozadí.

Tento program najprv skontroluje, či je e-mail už prijatý, pomocou funkcie emailExists() z helper.js. Ak e-mail v databáze neexistuje, vytvorí nového používateľa pomocou funkcie createUser(). Nakoniec vráti objekt používateľa.

Ak chcete prihlásiť používateľov, pridajte do passportConfig.js nasledovné:

modul.exports = (pas) => {
passport.use(
"miestna registrácia",
Nový LocalStrategy(
// Prihlásiť Se
)
);
passport.use(
"miestne prihlásenie",
Nový LocalStrategy(
{
usernameField: "e-mail",
hesloPole: "heslo",
},
async (e-mail, heslo, hotovo) => {
skúste {
konšt užívateľ = čakať emailExists (e-mail);
ak (!používateľ) vrátiť hotový(nulový, falošný);
konšt isMatch = čakať matchPassword (heslo, user.password);
ak (!isMatch) vrátiť hotový(nulový, falošný);
vrátiť hotový(nulový, {id: ID používateľa, email: user.email});
} chytiť (chyba) {
vrátiť hotovo (chyba, falošný);
}
}
)
);
};

Tu program najskôr skontroluje, či je email zaregistrovaný. Ak nie, vráti hodnotu false. Ak e-mail nájde, porovná jeho heslo s heslom zo žiadosti. Ak sa heslá zhodujú, prihlási používateľa a vráti objekt používateľa.

Posledným krokom je vytvorenie koncových bodov API:

  • POST /auth/registrácia
  • POST /auth/login

Oba tieto koncové body dostanú e-mail a heslo v tele žiadosti. Budú tiež obsahovať funkcie midlvéru na autentifikáciu pasov, ktoré sme práve nakonfigurovali.

Importujte a nastavte Passport v novom súbore s názvom server.js:

konšt pas = vyžadovať("pas");
vyžadovať(./passportConfig")(pas);

Potom pridajte nasledujúce trasy:

app.post(
"/auth/Prihlásiť Se",
passport.authenticate("local-signup", { relácie: falošný }),
(req, res, next) => {
res.json({
užívateľ: req.user,
});
}
);
app.post(
"/auth/Prihlásiť sa",
passport.authenticate("local-login", { relácie: falošný }),
(req, res, next) => {
res.json({ užívateľ: req.user });
}
);

Obe tieto trasy v prípade úspechu vrátia objekt JSON obsahujúci používateľa.

Skontrolujte svoje API pomocou testov jednotiek

Passport môžete použiť na autentifikáciu aplikácie Node pomocou aplikácie PostgreSQL. Vytvorili ste koncové body API na registráciu a prihlásenie používateľov.

Aj keď môžete použiť klientov REST, ako je Postman, aby ste otestovali, ako dobre funguje rozhranie API, písanie jednotkových testov je oveľa jednoduchšie. Unit testy vám umožňujú testovať jednotlivé časti vašej aplikácie. Týmto spôsobom, aj keď koncový bod zlyhá, môžete určiť presný bod zlyhania. Jedným z nástrojov, ktoré môžete použiť na testovanie aplikácií Node, je Jest.