Siunčiate duomenis iš vienos vietos į kitą? Dėl savo ramybės ir naudotojų apsaugos turėtumėte jį apsaugoti naudodami JWT.
Kai kuriate programą, labai svarbu apsaugoti slaptus duomenis nuo neteisėtos prieigos. Daugelis šiuolaikinių žiniatinklio, mobiliųjų ir debesies programų naudoja REST API kaip pagrindinę ryšio priemonę. Dėl to labai svarbu kurti ir plėtoti užpakalines API su sauga priešakyje.
Vienas veiksmingas būdas apsaugoti REST API apima JSON žiniatinklio prieigos raktus (JWT). Šie prieigos raktai siūlo patikimą vartotojo autentifikavimo ir autorizacijos mechanizmą, padedantį apsaugoti apsaugotus išteklius nuo kenkėjiškų veikėjų prieigos.
Kas yra JSON žiniatinklio prieigos raktai?
JSON žiniatinklio prieigos raktas (JWT) yra plačiai naudojamas saugumo standartas. Tai glaustas, savarankiškas būdas saugiai perduoti duomenis tarp kliento programos ir užpakalinės sistemos.
REST API gali naudoti JWT saugiai identifikuoti ir autentifikuoti vartotojus, kai jie pateikia HTTP užklausas pasiekti apsaugotus išteklius.
JSON žiniatinklio prieigos raktą sudaro trys atskiros dalys: antraštė, naudingoji apkrova ir parašas. Jis užkoduoja kiekvieną dalį ir sujungia jas naudojant tašką (".").
Antraštė apibūdina kriptografinį algoritmą, naudojamą žetonui pasirašyti, o naudingojoje apkrovoje yra duomenys apie vartotoją ir bet kokie papildomi metaduomenys.
Galiausiai parašas, apskaičiuotas naudojant antraštę, naudingą apkrovą ir slaptąjį raktą, užtikrina prieigos rakto vientisumą ir autentiškumą.
Nesusipratę su JWT pagrindais, sukurkime Node.js REST API ir įdiegkime JWT.
Nustatykite Express.js programą ir MongoDB duomenų bazę
Čia sužinosite, kaip sukurti paprastą autentifikavimą REST API kuri tvarko ir registracijos, ir prisijungimo funkcijas. Kai prisijungimo procesas autentifikuoja vartotoją, jis turėtų galėti pateikti HTTP užklausas į apsaugotą API maršrutą.
Čia galite rasti projekto kodą GitHub saugykla.
Pradėti, sukurti „Express“ žiniatinklio serverį, ir įdiekite šiuos paketus:
npm įdiegti cors dotenv bycrpt mongoose slapuko analizavimo šifravimo jsonwebtoken mongodb
Kitas, sukurti MongoDB duomenų bazę arba sukonfigūruokite MongoDB klasterį debesyje. Tada nukopijuokite duomenų bazės ryšio eilutę, sukurkite a .env failą šakniniame kataloge ir įklijuokite į ryšio eilutę:
CONNECTION_STRING="ryšio eilutė"
Sukonfigūruokite duomenų bazės ryšį
Sukurti naują utils/db.js failą projekto aplanko šakniniame kataloge. Šiame faile pridėkite šį kodą, kad sukurtumėte duomenų bazės ryšį naudodami Mongoose.
konst mangustas = reikalauti("mangustas");
konst connectDB = async () => {
bandyti {
laukti mongoose.connect (process.env. CONNECTION_STRING);
konsolė.log("Prisijungta prie MongoDB!");
} sugauti (klaida) {
konsolė.error("Klaida jungiantis prie MongoDB:", klaida);
}
};
modulis.exports = connectDB;
Apibrėžkite duomenų modelį
Apibrėžkite paprastą vartotojo duomenų schemą naudodami Mongoose. Šakniniame kataloge sukurkite naują model/user.model.js failą ir pridėkite šį kodą.
konst mangustas = reikalauti("mangustas");
konst userSchema = naujas mangustas. Schema({
Vartotojo vardas: Styga,
Slaptažodis: {
tipas: Styga,
reikalingas: tiesa,
Unikalus: tiesa,
},
});
konst Vartotojas = mongoose.model("Vartotojas", vartotojoSchema);
modulis.exports = Vartotojas;
Apibrėžkite API maršrutų valdiklius
Valdytojo funkcijos valdys registraciją ir prisijungimą; jie yra svarbi šios pavyzdinės programos dalis. Šakniniame kataloge sukurkite a controllers/userControllers.js failą ir pridėkite šį kodą:
- Apibrėžkite vartotojo registracijos valdiklį.
Šis kodo fragmentas sumaišo pateiktą slaptažodį naudojant bcrypt ir sukuria naują vartotojo įrašą duomenų bazėje, išsaugodamas vartotojo vardą ir maišos slaptažodį. Jei registracija sėkminga, ji išsiunčia atsakymą su sėkmės pranešimu.konst Vartotojas = reikalauti(„../models/user.model“);
konst bcrypt = reikalauti("bcrypt");
konst {generuoti prieigos raktą} = reikalauti(„../middleware/auth“);exports.registerUser = async (req, res) => {
konst { vartotojo vardas, slaptažodis } = req.body;bandyti {
konst maiša = laukti bcrypt.hash (slaptažodis, 10);
laukti User.create({ vartotojo vardas, Slaptažodis: maiša });
res.status(201).send({ žinutę: „Vartotojas sėkmingai užregistruotas“ });
} sugauti (klaida) {
konsolė.log (klaida);
res.status(500).send({ žinutę: 'Įvyko klaida!! ' });
}
}; - Apibrėžkite prisijungimo valdiklį, kad galėtumėte valdyti vartotojo prisijungimo procesą:
Kai vartotojas siunčia užklausą į /login maršrutą, jie turėtų perduoti savo autentifikavimo kredencialus užklausos turiniui. Tada kodas patikrina tuos kredencialus ir sugeneruoja JSON žiniatinklio prieigos raktą. Žetonas saugiai saugomas slapuke su Tik http vėliava nustatyta į teisingą. Tai neleidžia kliento pusės „JavaScript“ pasiekti prieigos rakto ir apsaugo nuo galimų scenarijų tarp svetainių (XSS) atakų.exports.loginUser = async (req, res) => {
konst { vartotojo vardas, slaptažodis } = req.body;bandyti {
konst vartotojas = laukti User.findOne({ vartotojo vardas });
jeigu (!Vartotojas) {
grąžinti res.status(404).send({ žinutę: 'Vartotojas nerastas' });
}konst PasswordMatch = laukti bcrypt.palyginti (slaptažodis, vartotojas.slaptažodis);
jeigu (!passwordMatch) {
grąžinti res.status(401).send({ žinutę: 'Neteisingi prisijungimo duomenys' });
}konst naudingoji apkrova = { Vartotojo ID: Vartotojo ID };
konst token = generuoti Token (naudingoji apkrova);
res.cookie("žetonas", žetonas, { Tik http: tiesa });
res.status(200.json({ žinutę: „Prisijungimas sėkmingas“});
} sugauti (klaida) {
konsolė.log (klaida);
res.status(500).send({ žinutę: „Prisijungiant įvyko klaida“ });
}
}; - Galiausiai apibrėžkite apsaugotą maršrutą:
Išsaugojus JWT slapuke, vėlesnėse autentifikuoto vartotojo API užklausose bus automatiškai įtrauktas prieigos raktas, leidžiantis serveriui patvirtinti ir įgalioti užklausas.exports.getUsers = async (req, res) => {
bandyti {
konst vartotojai = laukti User.find({});
res.json (vartotojai);
} sugauti (klaida) {
konsolė.log (klaida);
res.status(500).send({ žinutę: 'Įvyko klaida!!' });
}
};
Sukurkite tarpinę autentifikavimo programinę įrangą
Dabar, kai apibrėžėte prisijungimo valdiklį, kuris generuoja JWT prieigos raktą sėkmingai autentifikavus, apibrėžkite tarpinės programinės įrangos autentifikavimo funkcijas, kurios generuos ir patikrins JWT prieigos raktą.
Šakniniame kataloge sukurkite naują aplanką, tarpinė programinė įranga. Šiame aplanke pridėkite du failus: auth.js ir config.js.
Pridėkite šį kodą prie config.js:
konst kriptovaliuta = reikalauti("kriptovaliuta");
modulis.exports = {
SecretKey: crypto.randomBytes(32).toString('hex')
};
Šis kodas kiekvieną kartą paleidžiamas generuoja naują atsitiktinį slaptąjį raktą. Tada galite naudoti šį slaptą raktą, kad pasirašytumėte ir patikrintumėte JWT autentiškumą. Kai vartotojas sėkmingai autentifikuotas, sugeneruokite ir pasirašykite JWT naudodami slaptą raktą. Tada serveris naudos raktą, kad patikrintų, ar JWT galioja.
Įtraukite šį kodą auth.js kuri apibrėžia tarpinės programinės įrangos funkcijas, kurios generuoja ir tikrina JWT.
konst jwt = reikalauti("jsonwebtoken");
konst { secretKey } = reikalauti('./config');konst generuotiToken = (naudingoji apkrova) => {
konst token = jwt.sign (naudinga apkrova, slaptasis raktas, { baigiasi: '1h' });
grąžinti žetonas ;
};konst verifyToken = (req, res, next) => {
konst token = req.cookies.token;jeigu (!token) {
grąžinti res.status(401.json({ žinutę: „Žetonas nepateiktas“ });
}jwt.verify (token, secretKey, (err, decoded) => {
jeigu (err) {
grąžinti res.status(401.json({ žinutę: „Neteisingas prieigos raktas“ });
}req.userId = decoded.userId;
Kitas();
});
};
modulis.exports = {generuoti tokeną, patvirtinti ženklą};
The generuoti tokeną funkcija generuoja JWT, pasirašydama naudingą krovinį naudodama slaptą raktą ir nustatydama galiojimo laiką, kol verifyToken funkcija veikia kaip tarpinė programinė įranga, skirta patikrinti pateikto prieigos rakto autentiškumą ir galiojimą.
Apibrėžkite API maršrutus
Sukurti naują routes/userRoutes.js failą šakniniame kataloge ir pridėkite šį kodą.
konst išreikšti = reikalauti("išreikšti");
konst maršrutizatorius = greitasis. Maršrutizatorius ();
konst userControllers = reikalauti(„../controllers/userControllers“);
konst { verifyToken } = reikalauti(„../middleware/auth“);
router.post('/api/registras', userControllers.registerUser);
router.post('/api/login', userControllers.loginUser);
router.get(„/api/users“, verifyToken, userControllers.getUsers);
modulis.exports = maršrutizatorius;
Atnaujinkite savo serverio įėjimo tašką
Atnaujinkite savo server.js failą su tokiu kodu.
konst išreikšti = reikalauti("išreikšti");
konst cors = reikalauti("cors");
konst programa = express ();
konst prievadas = 5000;
reikalauti('dotenv'.config();
konst connectDB = reikalauti('./utils/db');
konst cookieParser = reikalauti("slapukų analizatorius");connectDB();
app.use (express.json());
app.use (express.urlencoded({ pratęstas: tiesa }));
app.use (cors());
app.use (cookieParser());
konst userRoutes = reikalauti('./routes/userRoutes');
app.use('/', userRoutes);
app.listen (port, () => {
konsolė.log(`Serveris klausosi http://localhost:${port}`);
});
Norėdami išbandyti REST API, sukite kūrimo serverį ir pateikite API užklausas į apibrėžtus galinius taškus:
mazgo serveris.js
Apsaugokite Node.js REST API
Apsaugoti Node.js REST API neapsiriboja tik JWT naudojimu, nors jos atlieka itin svarbų vaidmenį autentifikuojant ir autorizacija, labai svarbu laikytis holistinės saugos požiūrio į saugumą, kad apsaugotumėte savo bazinę sistemą sistemos. Be JWT, taip pat turėtumėte apsvarstyti galimybę įdiegti HTTPS, kad šifruotumėte ryšį, įvesties patvirtinimą ir dezinfekavimą bei daugelį kitų.
Sujungę kelias saugos priemones galite sukurti tvirtą savo saugumo sistemą Node.js REST API ir sumažina neteisėtos prieigos, duomenų pažeidimų ir kitos saugos riziką grasinimai.