Posielate údaje z jedného miesta na druhé? Pre váš vlastný pokoj a ochranu vašich používateľov by ste si to mali zabezpečiť pomocou JWT.
Pri vytváraní aplikácie je dôležité chrániť citlivé údaje pred neoprávneným prístupom. Mnoho moderných webových, mobilných a cloudových aplikácií používa REST API ako primárny komunikačný prostriedok. V dôsledku toho je kľúčové navrhnúť a vyvinúť backendové API s bezpečnosťou v popredí.
Jeden efektívny prístup k zabezpečeniu REST API zahŕňa JSON Web Tokeny (JWT). Tieto tokeny ponúkajú robustný mechanizmus na autentifikáciu a autorizáciu používateľov, čím pomáhajú chrániť chránené zdroje pred prístupom škodlivých aktérov.
Čo sú webové tokeny JSON?
Webový token JSON (JWT) je široko používaný bezpečnostný štandard. Poskytuje stručný a samostatný spôsob bezpečného prenosu údajov medzi klientskou aplikáciou a koncovým systémom.
Rozhranie REST API môže používať JWT na bezpečnú identifikáciu a autentifikáciu používateľov, keď zadávajú HTTP požiadavky na prístup k chráneným zdrojom.
Webový token JSON pozostáva z troch odlišných častí: hlavičky, užitočného zaťaženia a podpisu. Kóduje každú časť a spája ich pomocou bodky (".").
Hlavička popisuje kryptografický algoritmus použitý na podpísanie tokenu, zatiaľ čo užitočné zaťaženie obsahuje údaje o používateľovi a akékoľvek ďalšie metadáta.
Nakoniec podpis, vypočítaný pomocou hlavičky, užitočného zaťaženia a tajného kľúča, zaisťuje integritu a autentickosť tokenu.
Keď sú základy JWT z cesty, poďme zostaviť Node.js REST API a implementovať JWT.
Nastavte aplikáciu Express.js a databázu MongoDB
Tu sa dozviete, ako vytvoriť jednoduchú autentifikáciu REST API ktorý spravuje funkciu registrácie aj prihlásenia. Keď prihlasovací proces overí používateľa, mal by byť schopný odosielať požiadavky HTTP na chránenú trasu API.
Tu nájdete kód projektu úložisko GitHub.
Začať, vytvorte expresný webový servera nainštalujte tieto balíčky:
npm install cors dotenv bycrpt mongoose cookie-parser crypto jsonwebtoken mongodb
Ďalšie, vytvorte databázu MongoDB alebo nakonfigurovať klaster MongoDB v cloude. Potom skopírujte reťazec pripojenia k databáze, vytvorte a .env súbor v koreňovom adresári a vložte reťazec pripojenia:
CONNECTION_STRING="reťazec pripojenia"
Nakonfigurujte pripojenie k databáze
Vytvorte nový utils/db.js súbor v koreňovom adresári priečinka vášho projektu. Do tohto súboru pridajte nasledujúci kód na vytvorenie pripojenia k databáze pomocou Mongoose.
konšt mangusta = vyžadovať("mongoose");
konšt pripojiťDB = async () => {
skúste {
čakať mongoose.connect (process.env. CONNECTION_STRING);
konzoly.log("Pripojené k MongoDB!");
} chytiť (chyba) {
konzoly.chyba("Chyba pri pripájaní k MongoDB:", chyba);
}
};
modul.export = connectDB;
Definujte dátový model
Definujte jednoduchú schému používateľských údajov pomocou Mongoose. V koreňovom adresári vytvorte nový model/user.model.js súbor a pridajte nasledujúci kód.
konšt mangusta = vyžadovať("mongoose");
konšt userSchema = Nový mangusta. Schéma({
užívateľské meno: Reťazec,
heslo: {
typ: Reťazec,
požadovaný: pravda,
jedinečné: pravda,
},
});
konšt Používateľ = mongoose.model("používateľ", userSchema);
modul.exports = Používateľ;
Definujte radiče pre trasy API
Funkcie ovládača budú riadiť registráciu a prihlásenie; sú podstatnou súčasťou tohto vzorového programu. V koreňovom adresári vytvorte a controllers/userControllers.js súbor a pridajte nasledujúci kód:
- Definujte ovládač registrácie používateľov.
Tento útržok kódu hashuje poskytnuté heslo pomocou bcrypt a potom vytvorí nový používateľský záznam v databáze, v ktorom sa uloží používateľské meno a hashované heslo. Ak je registrácia úspešná, odošle odpoveď so správou o úspechu.konšt Používateľ = vyžadovať('../models/user.model');
konšt bcrypt = vyžadovať('bcrypt');
konšt { vygenerovať token } = vyžadovať('../middleware/auth');exports.registerUser = async (req, res) => {
konšt { meno používateľa, heslo } = req.body;skúste {
konšt hash = čakať bcrypt.hash (heslo, 10);
čakať User.create({ meno používateľa, heslo: hash });
res.status(201).odoslať({ správu: 'Používateľ sa úspešne zaregistroval' });
} chytiť (chyba) {
konzoly.log (chyba);
res.status(500).odoslať({ správu: 'Nastala chyba!! ' });
}
}; - Definujte radič prihlásenia na riadenie procesu prihlasovania používateľa:
Keď používateľ odošle požiadavku na /login cestu, mali by odovzdať svoje overovacie poverenia v tele žiadosti. Kód potom overí tieto poverenia a vygeneruje webový token JSON. Token je bezpečne uložený v súbore cookie s http Only príznak nastavený na hodnotu true. To bráni JavaScriptu na strane klienta v prístupe k tokenu a chráni pred potenciálnymi útokmi cross-site scripting (XSS).exports.loginUser = async (req, res) => {
konšt { meno používateľa, heslo } = req.body;skúste {
konšt užívateľ = čakať User.findOne({ meno používateľa });
ak (!user) {
vrátiť res.status(404).odoslať({ správu: 'Užívateľ Nenájdený' });
}konšt passwordMatch = čakať bcrypt.compare (heslo, user.password);
ak (!passwordMatch) {
vrátiť res.status(401).odoslať({ správu: 'Neplatné prihlasovacie údaje' });
}konšt užitočné zaťaženie = { ID používateľa: ID používateľa };
konšt token = generovaťToken (užitočné zaťaženie);
res.cookie('token', token, { http Only: pravda });
res.status(200.json({ správu: 'Prihlásenie úspešné'});
} chytiť (chyba) {
konzoly.log (chyba);
res.status(500).odoslať({ správu: "Pri prihlasovaní sa vyskytla chyba" });
}
}; - Nakoniec definujte chránenú cestu:
Uložením JWT do súboru cookie budú následné požiadavky API od overeného používateľa automaticky zahŕňať token, čo serveru umožní overiť a autorizovať požiadavky.exports.getUsers = async (req, res) => {
skúste {
konšt užívatelia = čakať User.find({});
res.json (používatelia);
} chytiť (chyba) {
konzoly.log (chyba);
res.status(500).odoslať({ správu: 'Nastala chyba!!' });
}
};
Vytvorte autentizačný middleware
Teraz, keď ste definovali kontrolér prihlásenia, ktorý generuje token JWT po úspešnej autentifikácii, definujte funkcie autentifikácie middlewaru, ktoré vygenerujú a overia token JWT.
V koreňovom adresári vytvorte nový priečinok, middleware. Do tohto priečinka pridajte dva súbory: auth.js a config.js.
Pridajte tento kód do config.js:
konšt krypto = vyžadovať('crypto');
modul.exports = {
tajný kľúč: crypto.randomBytes(32).natiahnuť('hex')
};
Tento kód generuje nový náhodný tajný kľúč pri každom spustení. Tento tajný kľúč potom môžete použiť na podpísanie a overenie pravosti JWT. Keď je používateľ úspešne overený, vygenerujte a podpíšte JWT pomocou tajného kľúča. Server potom použije kľúč na overenie platnosti JWT.
Pridajte nasledujúci kód auth.js ktorý definuje funkcie middlewaru, ktoré generujú a overujú JWT.
konšt jwt = vyžadovať('jsonwebtoken');
konšt { secretKey } = vyžadovať('./config');konšt vygenerovať token = (užitočné zaťaženie) => {
konšt token = jwt.sign (úžitkové zaťaženie, tajný kľúč, { expiruje v: '1h' });
vrátiť token ;
};konšt overiť token = (req, res, next) => {
konšt token = req.cookies.token;ak (!token) {
vrátiť res.status(401.json({ správu: „Neposkytol sa žiadny token“ });
}jwt.verify (token, tajný kľúč, (chyba, dekódované) => {
ak (chyba) {
vrátiť res.status(401.json({ správu: 'Neplatný Token' });
}req.userId = decoded.userId;
Ďalšie();
});
};
modul.exports = { vygenerujToken, over token };
The generovať token funkcia generuje JWT podpísaním užitočného zaťaženia pomocou tajného kľúča a nastavením času vypršania platnosti overiť token funkcia slúži ako middleware na overenie pravosti a platnosti poskytnutého tokenu.
Definujte trasy API
Vytvorte nový routes/userRoutes.js súbor v koreňovom adresári a pridajte nasledujúci kód.
konšt vyjadriť = vyžadovať('expresné');
konšt router = expres. Router();
konšt userControllers = vyžadovať('../controllers/userControllers');
konšt { overToken } = vyžadovať('../middleware/auth');
router.post('/api/register', userControllers.registerUser);
router.post('/api/login', userControllers.loginUser);
router.get('/api/users', overToken, userControllers.getUsers);
modul.export = router;
Aktualizujte svoj vstupný bod servera
Aktualizujte svoje server.js súbor s nasledujúcim kódom.
konšt vyjadriť = vyžadovať('expresné');
konšt kors = vyžadovať('cors');
konšt app = express();
konšt prístav = 5000;
vyžadovať('dotenv').config();
konšt pripojiťDB = vyžadovať('./utils/db');
konšt cookieParser = vyžadovať('cookie-parser');connectDB();
app.use (express.json());
app.use (express.urlencoded({ predĺžený: pravda }));
app.use (cors());
app.use (cookieParser());
konšt userRoutes = vyžadovať('./routes/userRoutes');
app.use('/', userRoutes);
app.listen (port, () => {
konzoly.log(`Server počúva na http://localhost:${port}`);
});
Ak chcete otestovať REST API, spustite vývojový server a vytvorte požiadavky API na definované koncové body:
uzol server.js
Zabezpečenie Node.js REST API
Zabezpečenie Node.js REST API presahuje len používanie JWT, hoci zohrávajú kľúčovú úlohu pri overovaní a autorizáciu, je nevyhnutné prijať holistický bezpečnostný prístup k bezpečnosti na ochranu vášho backendu systémov. Okrem JWT by ste mali zvážiť aj implementáciu HTTPS na šifrovanie komunikácie, overenie vstupu a dezinfekciu a mnoho ďalších.
Kombináciou viacerých bezpečnostných opatrení môžete vytvoriť robustný bezpečnostný rámec Node.js REST API a minimalizuje riziko neoprávneného prístupu, narušenia údajov a iného zabezpečenia vyhrážky.