Slanje podataka s jednog mjesta na drugo? Radi vlastite bezbrižnosti i zaštite vaših korisnika, trebali biste ga osigurati JWT-om.
Kada izrađujete aplikaciju, važno je zaštititi osjetljive podatke od neovlaštenog pristupa. Mnoge moderne web, mobilne i aplikacije u oblaku koriste REST API-je kao primarni način komunikacije. Kao rezultat toga, ključno je dizajnirati i razviti pozadinske API-je sa sigurnošću na čelu.
Jedan učinkovit pristup osiguravanju REST API-ja uključuje JSON web tokene (JWT). Ovi tokeni nude robustan mehanizam za autentifikaciju i autorizaciju korisnika, pomažući u zaštiti zaštićenih resursa od pristupa zlonamjernih aktera.
Što su JSON web tokeni?
JSON web token (JWT) široko je korišten sigurnosni standard. Pruža sažetu, samostalnu metodu sigurnog prijenosa podataka između klijentske aplikacije i pozadinskog sustava.
REST API može koristiti JWT za sigurnu identifikaciju i autentifikaciju korisnika kada postavljaju HTTP zahtjeve za pristup zaštićenim resursima.
JSON web token sastoji se od tri različita dijela: zaglavlje, sadržaj i potpis. Kodira svaki dio i povezuje ih pomoću točke (".").
Zaglavlje opisuje kriptografski algoritam koji se koristi za potpisivanje tokena, dok sadržaj sadrži podatke o korisniku i sve dodatne metapodatke.
Na kraju, potpis, izračunat korištenjem zaglavlja, nosivosti i tajnog ključa, osigurava integritet i autentičnost tokena.
Nakon što smo završili s osnovama JWT-a, napravimo Node.js REST API i implementirajmo JWT-ove.
Postavite Express.js aplikaciju i MongoDB bazu podataka
Ovdje ćete saznati kako izgraditi jednostavnu autentifikaciju REST API koji upravlja funkcijom registracije i prijave. Nakon što proces prijave autentificira korisnika, on bi trebao moći slati HTTP zahtjeve prema zaštićenoj API ruti.
Kôd projekta možete pronaći ovdje GitHub spremište.
Započeti, stvoriti Express web poslužitelj, i instalirajte ove pakete:
npm instalacija cors dotenv bycrpt mongoose cookie-parser crypto jsonwebtoken mongodb
Sljedeći, stvoriti MongoDB bazu podataka ili konfigurirati MongoDB klaster u oblaku. Zatim kopirajte niz veze baze podataka, stvorite a .env datoteku u korijenskom direktoriju i zalijepite u niz veze:
CONNECTION_STRING="niz veze"
Konfigurirajte vezu s bazom podataka
Stvorite novi utils/db.js datoteku u korijenskom direktoriju mape vašeg projekta. U ovu datoteku dodajte sljedeći kod za uspostavljanje veze s bazom podataka koristeći Mongoose.
konst mungos = zahtijevati('mungos');
konst povezivanjeDB = asinkroni () => {
probati {
čekati mongoose.connect (process.env. CONNECTION_STRING);
konzola.log("Povezan na MongoDB!");
} ulov (pogreška) {
konzola.greška("Pogreška pri povezivanju s MongoDB-om:", pogreška);
}
};
modul.exports = connectDB;
Definirajte podatkovni model
Definirajte jednostavnu shemu korisničkih podataka koristeći Mongoose. U korijenskom direktoriju stvorite novi model/user.model.js datoteku i dodajte sljedeći kod.
konst mungos = zahtijevati('mungos');
konst korisnička shema = novi mungos. Shema({
Korisničko ime: Niz,
lozinka: {
tip: Niz,
potreban: pravi,
jedinstveno: pravi,
},
});
konst Korisnik = mongoose.model("Korisnik", korisnička shema);
modul.exports = Korisnik;
Definirajte kontrolere za API rute
Funkcije kontrolera upravljat će registracijom i prijavom; oni su značajan dio ovog oglednog programa. U korijenskom direktoriju kreirajte a kontroleri/userControllers.js datoteku i dodajte sljedeći kod:
- Definirajte kontroler registracije korisnika.
Ovaj isječak koda raspršuje dostavljenu zaporku koristeći bcrypt i zatim stvara novi korisnički zapis u bazi podataka, pohranjujući korisničko ime i raspršenu zaporku. Ako je registracija uspješna, šalje odgovor s porukom o uspješnosti.konst Korisnik = zahtijevati('../models/user.model');
konst bcrypt = zahtijevati('bcrypt');
konst {generiraj token} = zahtijevati('../middleware/auth');exports.registerUser = asinkroni (req, res) => {
konst { korisničko ime, lozinka } = req.body;probati {
konst hash = čekati bcrypt.hash (lozinka, 10);
čekati User.create({ korisničko ime, lozinka: hash });
res.status(201).poslati({ poruka: 'Korisnik se uspješno registrirao' });
} ulov (pogreška) {
konzola.log (greška);
res.status(500).poslati({ poruka: 'Dogodila se pogreška!! ' });
}
}; - Definirajte kontroler prijave za upravljanje procesom prijave korisnika:
Kada korisnik pošalje zahtjev na /login rutu, trebali bi proslijediti svoje vjerodajnice za provjeru autentičnosti u tijelu zahtjeva. Kod zatim provjerava te vjerodajnice i generira JSON web token. Token je sigurno pohranjen u kolačiću s Samo http zastavica postavljena na istinito. To sprječava JavaScript na strani klijenta da pristupi tokenu, štiteći od mogućih napada skriptiranjem na više stranica (XSS).exports.loginUser = asinkroni (req, res) => {
konst { korisničko ime, lozinka } = req.body;probati {
konst korisnik = čekati User.findOne({ korisničko ime });
ako (!korisnik) {
povratak res.status(404).poslati({ poruka: 'Korisnik nije pronađen' });
}konst PasswordMatch = čekati bcrypt.compare (lozinka, korisnička.lozinka);
ako (!passwordMatch) {
povratak res.status(401).poslati({ poruka: 'Nevažeće vjerodajnice za prijavu' });
}konst nosivost = { userId: user._id };
konst token = generiraj token (korisni teret);
res.cookie('znak', token, { Samo http: pravi });
res.status(200).json({ poruka: 'Uspješna prijava'});
} ulov (pogreška) {
konzola.log (greška);
res.status(500).poslati({ poruka: 'Došlo je do pogreške prilikom prijave' });
}
}; - Konačno, definirajte zaštićenu rutu:
Pohranjivanjem JWT-a u kolačić, naredni API zahtjevi autentificiranog korisnika automatski će uključiti token, dopuštajući poslužitelju da potvrdi i autorizira zahtjeve.exports.getUsers = asinkroni (req, res) => {
probati {
konst korisnici = čekati User.find({});
res.json (korisnici);
} ulov (pogreška) {
konzola.log (greška);
res.status(500).poslati({ poruka: 'Dogodila se pogreška!!' });
}
};
Stvorite posredni softver za provjeru autentičnosti
Sada kada ste definirali kontroler za prijavu koji generira JWT token nakon uspješne provjere autentičnosti, definirajte funkcije provjere autentičnosti srednjeg softvera koje će generirati i provjeriti JWT token.
U korijenskom direktoriju stvorite novu mapu, međuprogramska oprema. Unutar ove mape dodajte dvije datoteke: auth.js i config.js.
Dodajte ovaj kod u config.js:
konst kripto = zahtijevati('kripto');
modul.izvoz = {
tajni ključ: crypto.randomBytes(32).toString('hex')
};
Ovaj kod svaki put kad se pokrene generira novi nasumični tajni ključ. Zatim možete koristiti ovaj tajni ključ za potpisivanje i provjeru autentičnosti JWT-ova. Nakon što je korisnik uspješno autentificiran, generirajte i potpišite JWT s tajnim ključem. Poslužitelj će zatim koristiti ključ za provjeru je li JWT ispravan.
Dodajte sljedeći kod auth.js koji definira funkcije međuprograma koje generiraju i provjeravaju JWT-ove.
konst jwt = zahtijevati('jsonwebtoken');
konst {tajniKljuč} = zahtijevati('./config');konst generirati token = (nosivost) => {
konst token = jwt.sign (payload, secretKey, { istječe: '1h' });
povratak žeton ;
};konst verifyToken = (req, res, next) => {
konst token = req.cookies.token;ako (!token) {
povratak res.status(401).json({ poruka: 'Nije osiguran token' });
}jwt.verify (token, secretKey, (pogreška, dekodirano) => {
ako (pogreška) {
povratak res.status(401).json({ poruka: 'Pogrešan token' });
}req.userId = decoded.userId;
Sljedeći();
});
};
modul.exports = {generiratiToken, verifyToken};
The generiratiToken funkcija generira JWT potpisivanjem korisnog tereta pomoću tajnog ključa i postavljanjem vremena isteka dok verifyToken funkcija služi kao posredni softver za provjeru autentičnosti i valjanosti dostavljenog tokena.
Definirajte API rute
Stvorite novi routes/userRoutes.js datoteku u korijenskom direktoriju i dodajte sljedeći kod.
konst izraziti = zahtijevati('izraziti');
konst ruter = express. Usmjerivač();
konst korisnički kontroleri = zahtijevati('../controllers/userControllers');
konst {verifyToken} = zahtijevati('../middleware/auth');
usmjerivač.post('/api/register', userControllers.registerUser);
usmjerivač.post('/api/login', userControllers.loginUser);
router.get('/api/users', verifyToken, userControllers.getUsers);
modul.exports = usmjerivač;
Ažurirajte svoju ulaznu točku poslužitelja
Ažurirajte svoje server.js datoteku sa sljedećim kodom.
konst izraziti = zahtijevati('izraziti');
konst cors = zahtijevati('cors');
konst app = express();
konst luka = 5000;
zahtijevati('dotenv').config();
konst povezivanjeDB = zahtijevati('./utils/db');
konst kolačićParser = zahtijevati('cookie-parser');povezivanjeDB();
app.use (express.json());
app.use (express.urlencoded({ proširena: pravi }));
app.use (cors());
app.use (cookieParser());
konst userRoutes = zahtijevati('./routes/userRoutes');
app.use('/', korisničke rute);
app.listen (port, () => {
konzola.log(`Poslužitelj sluša http://localhost:${port}`);
});
Za testiranje REST API-ja, pokrenite razvojni poslužitelj i postavite API zahtjeve prema definiranim krajnjim točkama:
poslužitelj čvora.js
Zaštita Node.js REST API-ja
Osiguranje Node.js REST API-ja nadilazi samo korištenje JWT-ova, iako igraju ključnu ulogu u autentifikaciji i autorizacije, bitno je usvojiti holistički sigurnosni pristup sigurnosti kako biste zaštitili svoju pozadinu sustava. Uz JWT, također biste trebali razmotriti implementaciju HTTPS-a za šifriranje komunikacije, provjeru valjanosti unosa i dezinfekciju i mnoge druge.
Kombinacijom višestrukih sigurnosnih mjera možete uspostaviti robustan sigurnosni okvir za svoje Node.js REST API-ji i minimiziraju rizik neovlaštenog pristupa, povrede podataka i drugu sigurnost prijetnje.