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.
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.
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
- Programiranje
- Programiranje
- Programski jezici
- Alati za programiranje
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.
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