Ako želite zaštititi osjetljivi sadržaj u svojoj aplikaciji Node, potreban vam je način provjere autentičnosti korisnika. Međutim, izgradnja vlastitog sustava provjere autentičnosti je složena i dugotrajna, a ako se ne izvede ispravno može dovesti do sigurnosnih ranjivosti u vašoj aplikaciji. Alati trećih strana kao što je Passport olakšavaju provjeru autentičnosti.

U ovom vodiču naučit ćete kako implementirati autentifikaciju u Node koristeći Passport i MongoDB.

Što su autentifikacija i autorizacija?

Iako se autentifikacija i autorizacija ponekad koriste naizmjenično, ova dva sigurnosna koncepta imaju različita značenja. Autentifikacija je proces provjere da je korisnik ono za koga se predstavlja, dok je autorizacija proces utvrđivanja ima li provjereni korisnik pristup određenim dijelovima vaše aplikacije.

Što je Passport.js?

Passport.js (ili Passport) je međuverzija za provjeru autentičnosti za NodeJS koja nudi više od 500 strategija za provjeru autentičnosti korisnika, uključujući putovnica-lokalna koji koristi korisničko ime i lozinku.

instagram viewer

Ovaj vodič koristi putovnica-lokalna i putovnica-jwt za osiguranje ruta.

Kako postaviti autentifikaciju korisnika u NodeJS-u

Sada znate nešto o autentifikaciji korisnika i Passport.js, možemo pogledati kako postaviti autentifikaciju na NodeJS. U nastavku smo naveli korake koje trebate poduzeti.

Korak 1: Postavite poslužitelj čvora

Stvorite mapu pod nazivom user-auth-nodejs i dođite do njega pomoću terminala.

mkdir user-auth-nodejs. 

cd user-auth-nodejs

Sljedeća inicijalizacija paket.json.

npm init

Budući da ćete koristiti Izraziti, pozadinski okvir NodeJS, instalirajte ga pokretanjem sljedeće naredbe.

npm izražavam

Sada kreirajte datoteku, app.js, i dodajte sljedeći kod za stvaranje poslužitelja.

const express = zahtijevati("izraziti");
const app = express();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Slušanje na portu ${PORT}`);
});

Povezano: Naučite kako instalirati Npm i Node.js na Ubuntu

Korak 2: Postavite bazu podataka

Potrebna vam je baza podataka za pohranjivanje korisničkih podataka. Koristit ćete mongoose za izradu MongoDB sheme podataka koja definira strukturu i vrstu podataka koje ćete pohraniti u bazu podataka. Budući da pohranjujete korisničke podatke, izradite korisničku shemu.

Instalirajte mungoose.

npm ja mungos

Napravite novu datoteku, userModel.js, i dodajte sljedeće.

const mongoose = require('mungoose')
const {Shema} = mungos
const UserSchema = nova shema ({
email: {
vrsta: niz,
potrebno: istina
},
zaporka: {
vrsta: niz,
potrebno: istina
}
})
const UserModel = mongoose.model('user', UserSchema);
module.exports = UserModel;

Povezano: Kako stvoriti bazu podataka i kolekciju u MongoDB-u

Prije pohrane lozinke morate je šifrirati iz sigurnosnih razloga. Vi ćete koristiti bcryptjs, vrlo koristan npm paket koji olakšava rad s šifriranim lozinkama.

Instalirati bcryptjs.

npm i bcryptjs

Izmijeniti usermodel.js za šifriranje lozinke prije spremanja u bazu podataka.

const mongoose = require('mungoose')
const bcrypt = zahtijevaju('bcryptjs');
const {Shema} = mungos

const UserSchema = nova shema ({
...
})
UserSchema.pre('save', async function (next) {
probaj {
// provjeriti način registracije
const korisnik = ovo;
if (!user.isModified('password')) next();
// generirati sol
const sol = čekaj bcrypt.genSalt (10);
// hash lozinku
const hasshedPassword = čekati bcrypt.hash (ova.password, sol);
// zamjena običnog teksta lozinkom raspršenom lozinkom
this.password = hasshedPassword;
Sljedeći();
} uhvatiti (pogreška) {
povratak sljedeći (greška);
}
});
...
const Korisnik = mongoose.model('Korisnik', Korisnička shema);

Ovdje koristite a unaprijed spremiti kuka za izmjenu lozinke prije spremanja. Ideja je pohraniti hash verziju lozinke umjesto lozinke običnog teksta. Hash je dugi složeni niz generiran iz niza običnog teksta.

Koristiti je izmijenjeno da provjerite mijenja li se lozinka budući da trebate samo hashirati nove lozinke. Zatim generirajte sol i proslijedite je s lozinkom običnog teksta u hash metodu za generiranje hashirane lozinke. Konačno, zamijenite zaporku običnog teksta s hashiranom lozinkom u bazi podataka.

Napravite db.js i konfigurirajte bazu podataka.

const mungoose = zahtijevaju("mungoose");
mungos. Obećanje = globalno. Obećanje;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mungoose.veza;
db.on("greška", () => {
console.log("ne mogu se povezati");
});
db.once("otvori", () => {
console.log("> Uspješno povezan s bazom podataka");
});
};
module.exports = { povezati };

U app.js se povežite s bazom podataka.

// spajanje na db
const db = zahtijevaju('./db');
db.connect();

Korak 3: Postavite putovnicu

Instalirati Putovnica i putovnica-lokalna. Te ćete pakete koristiti za registraciju i prijavu korisnika.

npm i putovnica
npm i putovnica-lokalna

Napravite novu datoteku, passportConfig.js, i uvoz putovnica-lokalna i userModel.js.

const LocalStraregy = zahtijevaju("passport-local").Strategija;
const Korisnik = zahtijeva ("./userModel");

Konfigurirajte Passport za upravljanje registracijom korisnika.

const LocalStrategy = zahtijevaju("passport-local");
const Korisnik = zahtijeva ("./userModel");
module.exports = (putovnica) => {
putovnica.upotreba(
"lokalna prijava",
nova lokalna strategija(
{
polje korisničkog imena: "e-pošta",
passwordField: "password",
},
async (e-pošta, lozinka, gotovo) => {
probaj {
// provjeriti postoji li korisnik
const userExists = await User.findOne({ "e-pošta": email });
if (userExists) {
povratak dovršen (null, false)
}
// Stvorite novog korisnika s navedenim korisničkim podacima
const user = await User.create({ email, password });
vraćanje izvršeno (null, korisnik);
} uhvatiti (pogreška) {
učinjeno (pogreška);
}
}
)
);
}

U gornjem kodu provjeravate je li e-pošta već u upotrebi. Ako email ne postoji, registrirajte korisnika. Imajte na umu da također postavljate polje korisničkog imena za prihvaćanje e-pošte. Prema zadanim postavkama, putovnica-lokalna očekuje korisničko ime, pa mu trebate reći da umjesto toga prosljeđujete e-poštu.

Koristiti putovnica-lokalna također rukovati prijavom korisnika.

module.exports = (putovnica) => {
putovnica.upotreba(
"lokalna prijava",
nova lokalna strategija(
...
)
);
putovnica.upotreba(
"lokalna prijava",
nova lokalna strategija(
{
polje korisničkog imena: "e-pošta",
passwordField: "password",
},
async (e-pošta, lozinka, gotovo) => {
probaj {
const user = await User.findOne({ email: email });
if (!user) vraćanje dovršeno (null, false);
const isMatch = čekati korisnika.matchPassword (lozinka);
if (!isMatch)
povratak dovršen (null, false);
// ako se lozinke podudaraju s povratnim korisnikom
vraćanje izvršeno (null, korisnik);
} uhvatiti (pogreška) {
console.log (pogreška)
povratak dovršen (greška, laž);
}
}
)
);
};

Ovdje provjerite postoji li korisnik u bazi podataka, a ako postoji, provjerite odgovara li unesena lozinka s onom u bazi podataka. Imajte na umu da također zovete podudaranje lozinke() metodu na modelu korisnika pa idite na userModel.js datoteku i dodajte je.

UserSchema.methods.matchPassword = async funkcija (lozinka) {
probaj {
return await bcrypt.compare (password, this.password);
} uhvatiti (pogreška) {
baciti novu Greška (greška);
}
};

Ova metoda uspoređuje lozinku korisnika i onu u bazi podataka i vraća true ako se podudaraju.

Korak 4: Postavite rute provjere autentičnosti

Sada morate stvoriti krajnje točke na koje će korisnici slati podatke. Prvi je put prijave koji će prihvatiti email i lozinku novog korisnika.

U app.js, upotrijebite međuprogram za provjeru autentičnosti putovnice koji ste upravo stvorili za registraciju korisnika.

app.post(
 "/auth/signup",
passport.authenticate('local-signup', { session: false }),
(req, res, next) => {
// prijavi se
res.json({
korisnik: req.user,
});
}
);

Povezano: Autentifikacija vs. Autorizacija: u čemu je razlika?

Ako je uspješna, ruta prijave bi trebala vratiti kreiranog korisnika.

Zatim kreirajte rutu za prijavu.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// prijaviti se
res.json({
korisnik: req.user,
});
}
);

Korak 5: Dodajte zaštićene rute

Do sada ste koristili Putovnica za stvaranje međuvera koji registrira korisnika u bazi podataka i drugog koji registriranom korisniku omogućuje prijavu. Zatim ćete stvoriti međuverski program za autorizaciju za zaštitu osjetljivih ruta pomoću JSON web tokena (JWT). Da biste implementirali JWT autorizaciju, trebate:

  • Generirajte JWT token.
  • Proslijedite token korisniku. Korisnik će ga poslati natrag u zahtjevima za autorizaciju.
  • Potvrdite token koji je korisnik vratio.

Koristit ćete se jsonwebtoken paket za rukovanje JWT-ovima.

Pokrenite sljedeću naredbu da biste je instalirali.

npm i jsonwebtoken

Zatim generirajte token za svakog korisnika koji se uspješno prijavi.

U app.js, uvoz jsonwebtoken i izmijenite rutu prijave kao u nastavku.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(req, res, next) => {
// prijaviti se
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
ako (err) {
vrati res.json({
poruka: "Prijava nije uspjela",
token: null,
});
}
res.json({
znak
});
})
}
);

U stvarnoj aplikaciji, koristili biste kompliciraniji tajni ključ i pohranili ga u konfiguracijsku datoteku.

Ruta za prijavu vraća token ako je uspješna.

Koristiti putovnica-jwt pristup zaštićenim rutama.

npm i putovnica-jwt

U passportConfig.js, konfigurirajte putovnica-jwt.

const JwtStrategy = zahtijevaju("passport-jwt").Strategija;
const { ExtractJwt } = zahtijevaju ("passport-jwt")
module.exports = (putovnica) => {
putovnica.upotreba(
"lokalna prijava",
nova lokalna strategija(
...
);
putovnica.upotreba(
nova JwtStrategy(
{
jwtFromRequest: ExtractJwt.fromHeader("autorizacija"),
secretOrKey: "secretKey",
},
async (jwtPayload, gotovo) => {
probaj {
// Izdvoj korisnika
const korisnik = jwtPayload.user;
učinjeno (null, korisnik);
} uhvatiti (pogreška) {
učinjeno (pogreška, netočno);
}
}
)
);
};

Primijetite da izvlačite JWT iz zaglavlja autorizacije umjesto tijela zahtjeva. To sprječava hakere da presretnu zahtjev i zgrabe token.

Da vidim kako putovnica-jwt čuva rute, stvori zaštićenu rutu u app.js.

app.get(
"/user/protected",
passport.authenticate("jwt", { session: false }),
(req, res, next) => {
res.json({user: req.user});
}
);

Samo zahtjev s valjanim JWT vraća korisničke podatke.

Sada ste spremni podići svoju korisničku autentifikaciju na sljedeću razinu

U ovom vodiču naučili ste kako možete autentificirati korisnike pomoću e-pošte i lozinke uz pomoć putovnice. U početku se može činiti zastrašujuće, ali proces je relativno jednostavan. Možete ići još dalje i koristiti pružatelje identiteta trećih strana koje podržava Passport, kao što su Twitter, Facebook i Google.

Što je autentifikacija korisnika i kako funkcionira?

Važno je razumjeti osnove provjere autentičnosti korisnika kako biste osigurali maksimalnu razinu sigurnosti za svoje mrežne račune. Dakle, uronimo.

Pročitajte dalje

UdioCvrkutE-mail
Povezane teme
  • Programiranje
  • Programiranje
  • Programski jezici
  • Alati za programiranje
O autoru
Mary Gathoni (Objavljeno 8 članaka)

Mary Gathoni je programerica softvera sa strašću za stvaranje tehničkog sadržaja koji nije samo informativan nego i privlačan. Kad ne kodira i ne piše, uživa u druženju s prijateljima i na otvorenom.

Više od Mary Gathoni

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e-knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu