Fejlesztőként az Ön felelőssége a felhasználók adatainak hitelesítéssel történő védelme. A Passport.js segítségével hitelesítheti a felhasználókat a Node és a Postgres alkalmazásokban.

Kezdje egy csomópont-kiszolgáló létrehozásával végpontokkal a felhasználók regisztrálásához, bejelentkezéséhez és kijelentkezéséhez. Engedheti, hogy a Passport kezelje a hitelesítést, hogy korlátozza az alkalmazáshoz való jogosulatlan hozzáférést.

Felhasználói tábla létrehozása

A felhasználói hitelesítéshez egy e-mailt és egy jelszót fog használni. Ez azt jelenti, hogy a felhasználók táblájának tartalmaznia kell egy e-mail-címet és egy jelszómezőt. A psql parancssorban hozzon létre egy új adatbázist nodeapp néven:

TEREMTADATBÁZIS nodeapp;

Ezután hozzon létre egy táblázatot a felhasználók tárolására:

TEREMTASZTALfelhasználókat (
azonosító INT MINDIG ELSŐDLEGES AZONOSÍTÁSI KULCSKÉNT LÉTREHOZOTT,
e-mail CHAR(128),
jelszó CHAR(60)
);

Ez a kód egy új táblázatot hoz létre, amely e-mail címet, jelszót és egy automatikusan generált azonosító mezőt tartalmaz.

Csomópont-kiszolgáló létrehozása

A Node.js egy szerveroldali JavaScript futási környezet, amely lehetővé teszi a HTTP-kiszolgálók gyors létrehozását. A kiszolgáló és a különböző HTTP-útvonalak létrehozásának egyszerűsítésére használhatja Express, egy Node.js webes keretrendszer.

Futtassa ezt a parancsot egy új postgres-auth nevű mappa létrehozásához:

mkdir postgres-auth

Ezután inicializálja az npm-et:

npm init -y

Végül telepítse az Expresst:

npm install express

Most tudsz hozza létre a Node webszervert.

Egy új fájlban, melynek neve index.js, adja hozzá a következőket:

const expressz = igényelnek("Expressz");
const app = express();
app.use (express.json());
app.use (express.urlencoded({ kiterjedt: igaz }));
app.listen(3000, () => konzol.log("Hangolás a porton 3000"));

A kód futtatása elindítja a szervert, és a következőket naplózza a konzolon:

Hallgatás a 3000-es porton

Csatlakozás a PostgreSQL-hez

Nak nek csatlakozni a PostgreSQL-hez használat csomópont-postgres. A node-postgres egy kapcsolati illesztőprogram, amely interfészt biztosít a Node és a Postgres között.

Hajtsa végre a következőket a node-postrges npm-en keresztüli telepítéséhez:

npm telepítés pg

Miután telepítette a könyvtárat, hozzon létre egy új fájlt db.js és csatlakoztassa az adatbázishoz:

const { Ügyfél } = igényelnek("pg");
const { felhasználó, gazdagép, adatbázis, jelszó, port } = igényelnek(./dbConfig");

const ügyfél = új Ügyfél({
felhasználó,
házigazda,
adatbázis,
Jelszó,
kikötő,
});

client.connect();
modult.exports = ügyfél;

A node-postgres kliens metódusa veszi annak az adatbázisnak a részleteit, amelyhez csatlakozik. Ez a program importálja a kapcsolat részleteit egy nevű fájlból dbConfig. Ezért hozza létre azt a fájlt, és adja hozzá a következő kódot:

modult.exports = {
felhasználó: "postgres",
host: "localhost",
adatbázis: "nodeapp",
jelszó: "YourPassword",
kikötő: 5432,
};

Adatbázis-segítő funkciók létrehozása

Mindig jó gyakorlat az egyes függvények használata az adatbázissal való interakcióhoz. Ezek megkönnyítik az egységtesztek írását, és javítják az újrafelhasználhatóságot. A regisztrációs végponthoz két függvényt kell létrehoznia:

  1. Annak ellenőrzésére, hogy az e-mail már regisztrálva van-e.
  2. A felhasználó létrehozásához.

A cél az, hogy csak akkor regisztráljanak egy felhasználót, ha az nem létezik az adatbázisban.

Hozzon létre egy új fájlt helper.js és importálja az adatbázis-ügyfelet a db.js-ből:

const ügyfél = igényelnek("./db.js")

Ezután adjon hozzá egy új emailExists() nevű függvényt:

const emailExists = async (e-mail) => {
const adatok = várják client.query("SELECT * FROM felhasználók WHERE email=$1", [
email,
]);

ha (data.rowCount == 0) Visszatéréshamis;
Visszatérés data.rows[0];
};

Ez a funkció fogad egy e-mailt, és ellenőrzi, hogy használatban van-e már. Ezt a SELECT záradék használatával teszi meg, amely egy sort ad vissza, amelynek e-mail mezője megegyezik a regisztráló felhasználó által megadott értékkel. Ha az e-mail nem létezik, false értéket ad vissza.

A felhasználót létrehozó függvény létrehozásához adjon hozzá egy createUser() nevű függvényt a helper.js fájlhoz:

const createUser = async (e-mail, jelszó) => {
const só = várják bcrypt.genSalt(10);
const hash = várják bcrypt.hash (jelszó, só);

const adatok = várják client.query(
"INSERT INTO felhasználók (e-mail, jelszó) ÉRTÉKEK ($1, $2) AZ azonosító, e-mail, jelszó VISSZATÉRÉSE",
[e-mail, hash]
);

ha (data.rowCount == 0) Visszatéréshamis;
Visszatérés data.rows[0];
};

Ez a funkció az e-mail és a jelszó értékeket veszi fel. Az INSERT záradék segítségével új sort hoz létre ezekkel az adatokkal, és ha sikeres, visszaadja az újonnan létrehozott felhasználót. Vegye figyelembe, hogy a jelszó tárolása előtt meg kell tennie kivonatolja a bcrypt segítségével. Soha nem jó ötlet a jelszavakat egyszerű szövegként tárolni. Ha a hackerek hozzáfértek a felhasználói adatbázishoz, könnyen hozzáférhetnek a bizalmas információkhoz.

A használat megkezdéséhez telepítse a bcryptjs-t:

npm telepítse a bcryptjs-t

A helper.js-ben importálja a bcryptjs-t:

const bcrypt = igényelnek("bcryptjs")

A Bcryptjs használatával az adatbázis csak a titkosított jelszót tárolja. Ezért a bejelentkezés során össze kell hasonlítania a felhasználó által megadott egyszerű szöveges jelszót és az adatbázisban lévő kivonatolt jelszót. Ehhez használhatja a Bcryptjs által biztosított összehasonlítási módszert.

Hozzon létre egy matchPassword() nevű függvényt:

const matchPassword = async (jelszó, hashPassword) => {
const egyezés = várják bcrypt.compare (jelszó, hashPassword);
Visszatérés mérkőzés
};

Megkapja az egyszerű jelszót és a hash-t, majd a Bcrypt.compare() segítségével határozza meg, hogy a megadott jelszó helyes-e. Ha igen, akkor igazat ad vissza, ellenkező esetben hamis értéket ad vissza.

Ezeket a funkciókat fogjuk használni az adatbázissal való interakcióhoz. Ügyeljen arra, hogy a végén mindegyiket exportálja:

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

A Passport konfigurálása

A Passport egy csomóponti hitelesítési köztes szoftver, amely több mint 500 hitelesítési stratégiát biztosít, mint például a közösségi bejelentkezés, a JSON Web Tokens (JWT) és az e-mail hitelesítés. Ez utóbbit fogjuk használni, amit az útlevél-helyi stratégia biztosít.

A passport és passport-local telepítéséhez használja a következő parancsot:

npm útlevél telepítése
npm install passport-local

Ezután állítsa be a Passportot a meglévő felhasználók bejelentkezéséhez és új felhasználók regisztrálásához.

Kezdje egy új fájl létrehozásával passportConfig.js. Ezután importálja a Passport helyi stratégiát és az imént létrehozott adatbázis-segédfunkciókat:

const LocalStrategy = igényelnek("útlevél-helyi");
const { emailExists, createUser, matchPassword } = igényelnek("./segítő");

Ugyanabban a fájlban adja hozzá a következőket a felhasználói regisztráció beállításához:

modult.exports = (útlevél) => {
passport.use(
"helyi regisztráció",
új LocalStrategy(
{
felhasználónévMező: "e-mail",
jelszóMező: "jelszó",
},
async (e-mail, jelszó, kész) => {
próbálja meg {
const userExists = várják e-mail létezik (e-mail)

ha (felhasználó létezik) {
Visszatérés Kész(nulla, hamis);
}

const felhasználó = várják createUser (e-mail, jelszó);
Visszatérés Kész(nulla, felhasználó);
} fogás (hiba) {
kész (hiba);
}
}
)
);
}

Mivel a passport-local felhasználónevet és jelszót vár, Ön pedig e-mailt használ, állítsa be a felhasználónév mezőt e-mailre. A felhasználó, vagy inkább az alkalmazás frontend része elküldi az e-mailt és a jelszót a kérés törzsében. Az értékeket azonban nem kell magának kinyernie, mivel a Passport kezeli ezt a háttérben.

Ez a program először ellenőrzi, hogy az e-mail már foglalt-e a helper.js emailExists() függvényével. Ha az e-mail nem létezik az adatbázisban, akkor a createUser() függvénnyel új felhasználót hoz létre. Végül visszaadja a felhasználói objektumot.

A felhasználók bejelentkezéséhez adja hozzá a következőket a passportConfig.js fájlhoz:

modult.exports = (útlevél) => {
passport.use(
"helyi regisztráció",
új LocalStrategy(
// regisztrálj
)
);
passport.use(
"helyi bejelentkezés",
új LocalStrategy(
{
felhasználónévMező: "e-mail",
jelszóMező: "jelszó",
},
async (e-mail, jelszó, kész) => {
próbálja meg {
const felhasználó = várják emailExists (e-mail);
ha (!felhasználó) Visszatérés Kész(nulla, hamis);
const isMatch = várják matchPassword (jelszó, user.password);
ha (!isMatch) Visszatérés Kész(nulla, hamis);
Visszatérés Kész(nulla, {id: Felhasználói azonosító, email: user.email});
} fogás (hiba) {
Visszatérés kész (hiba, hamis);
}
}
)
);
};

Itt a program először ellenőrzi, hogy az e-mail regisztrálva van-e. Ha nem, akkor hamis értéket ad vissza. Ha megtalálja az e-mailt, összehasonlítja a jelszavát a kérésben szereplővel. Ha a jelszavak megegyeznek, bejelentkezik a felhasználóba, és visszaadja a felhasználói objektumot.

Az utolsó lépés az API-végpontok létrehozása:

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

Mindkét végpont kap egy e-mailt és egy jelszót a kérelem törzsében. Tartalmazni fogják az általunk most konfigurált útlevél-hitelesítési köztes szoftver funkciókat is.

Importálja és állítsa be a Passportot egy új nevű fájlban server.js:

const útlevél = igényelnek("útlevél");
igényelnek(./passportConfig")(útlevél);

Ezután adja hozzá a következő útvonalakat:

app.post(
"/auth/regisztrálj",
passport.authenticate("local-signup", { ülés: hamis }),
(req, res, next) => {
res.json({
felhasználó: req.user,
});
}
);
app.post(
"/auth/Belépés",
passport.authenticate("local-login", { ülés: hamis }),
(req, res, next) => {
res.json({ felhasználó: req.user });
}
);

Mindkét útvonal a felhasználót tartalmazó JSON-objektumot ad vissza, ha sikeres.

Ellenőrizze az API-ját egységtesztekkel

A Passport segítségével PostgreSQL-alkalmazással hitelesítheti a Node-alkalmazásokat. API-végpontokat hozott létre a felhasználók regisztrációjához és bejelentkezéséhez.

Míg a REST-klienseket, például a Postmant használhatja az API működésének tesztelésére, az egységtesztek írása sokkal egyszerűbb. Az egységtesztek lehetővé teszik az alkalmazás egyes részeinek tesztelését. Így még akkor is, ha egy végpont meghibásodik, pontosan meghatározhatja a hibapontot. A Node alkalmazások tesztelésére használható egyik eszköz a Jest.