Andmete saatmine ühest kohast teise? Enda meelerahu ja kasutajate kaitse tagamiseks peaksite selle kaitsma JWT-ga.

Rakenduse loomisel on oluline kaitsta tundlikke andmeid volitamata juurdepääsu eest. Paljud kaasaegsed veebi-, mobiili- ja pilverakendused kasutavad peamise suhtlusvahendina REST API-sid. Seetõttu on ülioluline kujundada ja arendada taustarakendusliidesed, mille turvalisus on esirinnas.

Üks tõhus viis REST API turvamiseks hõlmab JSON-i veebimärke (JWT). Need märgid pakuvad tugevat mehhanismi kasutajate autentimiseks ja autoriseerimiseks, aidates kaitsta kaitstud ressursse pahatahtlike osalejate juurdepääsu eest.

Mis on JSON-i veebimärgid?

JSON-i veebimärk (JWT) on laialdaselt kasutatav turvastandard. See pakub kokkuvõtlikku ja iseseisvat meetodit andmete turvaliseks edastamiseks kliendirakenduse ja taustsüsteemi vahel.

REST API saab kasutada JWT-sid kasutajate turvaliseks tuvastamiseks ja autentimiseks, kui nad esitavad HTTP-päringuid kaitstud ressurssidele juurdepääsuks.

JSON-i veebimärk koosneb kolmest erinevast osast: päisest, kasulikust koormusest ja allkirjast. See kodeerib iga osa ja ühendab need punktiga (".").

Päis kirjeldab krüptoalgoritmi, mida kasutatakse märgi allkirjastamiseks, samas kui kasulik koormus sisaldab andmeid kasutaja kohta ja täiendavaid metaandmeid.

Lõpuks tagab päise, kasuliku koormuse ja salajase võtme abil arvutatud allkiri märgi terviklikkuse ja autentsuse.

Kui JWT-de põhitõed on eemal, loome Node.js REST API ja juurutame JWT-d.

Seadistage rakendus Express.js ja MongoDB andmebaas

Siit saate teada, kuidas luua lihtsat autentimist REST API mis tegeleb nii registreerimis- kui ka sisselogimisfunktsioonidega. Kui sisselogimisprotsess kasutaja autentib, peaks tal olema võimalik teha HTTP-päringuid kaitstud API marsruudile.

Siit leiate projekti koodi GitHubi hoidla.

Alustamiseks luua Expressi veebiserverja installige need paketid:

npm install cors dotenv bycrpt mongoose cookie-parser krüpto jsonwebtoken mongodb

Järgmiseks looge MongoDB andmebaas või konfigureerige pilves MongoDB klaster. Seejärel kopeerige andmebaasi ühenduse string, looge a .env fail juurkataloogis ja kleepige ühenduse stringi:

CONNECTION_STRING="ühendusstring"

Andmebaasiühenduse konfigureerimine

Loo uus utils/db.js faili oma projekti kausta juurkataloogis. Lisage sellesse faili andmebaasiühenduse loomiseks Mongoose'i abil järgmine kood.

konst mangust = nõuda("mongoose");

konst connectDB = asünkr () => {
proovi {
ootama mongoose.connect (process.env. CONNECTION_STRING);
konsool.log("Ühendatud MongoDB-ga!");
} püüda (viga) {
konsool.error("Viga MongoDB-ga ühenduse loomisel:", viga);
}
};

moodul.exports = connectDB;

Määratlege andmemudel

Määrake Mongoose abil lihtne kasutajaandmete skeem. Loo juurkataloogis uus model/user.model.js faili ja lisage järgmine kood.

konst mangust = nõuda("mongoose");

konst userSchema = uus mangust. Skeem({
kasutajanimi: String,
parool: {
tüüp: String,
nõutud: tõsi,
ainulaadne: tõsi,
},
});

konst Kasutaja = mongoose.model("Kasutaja", userSchema);
moodul.exports = Kasutaja;

Määrake API marsruutide kontrollerid

Kontrolleri funktsioonid haldavad registreerimist ja sisselogimist; nad on selle näidisprogrammi oluline osa. Loo juurkataloogis a controllers/userControllers.js faili ja lisage järgmine kood:

  1. Määratlege kasutaja registreerimise kontroller.
    konst Kasutaja = nõuda('../models/user.model');
    konst bcrypt = nõuda('bcrypt');
    konst {genereerida Token} = nõuda("../middleware/auth");

    exports.registerUser = asünkr (req, res) => {
    konst { kasutajanimi, parool } = req.body;

    proovi {
    konst räsi = ootama bcrypt.hash (parool, 10);
    ootama User.create({ kasutajanimi, parool: räsi });
    res.status(201).saada({ sõnum: "Kasutaja registreeriti edukalt" });
    } püüda (viga) {
    konsool.log (viga);
    res.status(500).saada({ sõnum: 'Ilmnes viga!! ' });
    }
    };

    See koodilõik räsib antud parooli bcrypti abil ja loob seejärel andmebaasis uue kasutajakirje, salvestades kasutajanime ja räsitud parooli. Kui registreerimine õnnestub, saadab see vastuse koos edusõnumiga.
  2. Määrake kasutaja sisselogimisprotsessi haldamiseks sisselogimiskontroller:
    exports.loginUser = asünkr (req, res) => {
    konst { kasutajanimi, parool } = req.body;

    proovi {
    konst kasutaja = ootama User.findOne({ kasutajanimi });

    kui (!kasutaja) {
    tagasi res.status(404).saada({ sõnum: "Kasutajat ei leitud" });
    }

    konst passwordMatch = ootama bcrypt.compare (parool, kasutaja.parool);

    kui (!passwordMatch) {
    tagasi res.status(401).saada({ sõnum: "Valed sisselogimismandaadid" });
    }

    konst kasulik koormus = { kasutaja ID: kasutaja ID };
    konst token = genereeridaToken (kasulik koormus);
    res.cookie('märk', märk, { Ainult http: tõsi });
    res.status(200).json({ sõnum: "Sisselogimine õnnestus"});
    } püüda (viga) {
    konsool.log (viga);
    res.status(500).saada({ sõnum: "Sisselogimisel ilmnes viga" });
    }
    };

    Kui kasutaja saadab päringu /login marsruudil, peaksid nad edastama oma autentimismandaadid päringu kehasse. Seejärel kontrollib kood need mandaadid ja loob JSON-i veebimärgi. Märk on turvaliselt salvestatud küpsisesse koos Ainult http lipp seatud tõeseks. See hoiab ära kliendipoolse JavaScripti juurdepääsu loale, kaitstes potentsiaalsete saidiüleste skriptimisrünnakute (XSS) rünnakute eest.
  3. Lõpuks määrake kaitstud marsruut:
    exports.getUsers = asünkr (req, res) => {
    proovi {
    konst kasutajad = ootama User.find({});
    res.json (kasutajad);
    } püüda (viga) {
    konsool.log (viga);
    res.status(500).saada({ sõnum: 'Ilmnes viga!!' });
    }
    };
    Kui salvestate JWT küpsisesse, sisaldavad autentitud kasutaja järgnevad API päringud automaatselt luba, mis võimaldab serveril päringuid kinnitada ja autoriseerida.

Looge autentimise vahevara

Nüüd, kui olete määratlenud sisselogimiskontrolleri, mis genereerib eduka autentimise korral JWT-märgi, määrake vahevara autentimisfunktsioonid, mis genereerivad ja kontrollivad JWT-luba.

Loo juurkataloogis uus kaust, vahevara. Lisage sellesse kausta kaks faili: auth.js ja config.js.

Lisage see kood config.js:

konst krüpto = nõuda("krüpto");

moodul.exports = {
SecretKey: crypto.randomBytes(32).toString('hex')
};

See kood genereerib uue juhusliku salajase võtme iga kord, kui see töötab. Seejärel saate seda salajast võtit kasutada JWT-de allkirjastamiseks ja autentsuse kontrollimiseks. Kui kasutaja on edukalt autentitud, genereerige ja allkirjastage salajase võtmega JWT. Seejärel kasutab server võtit, et kontrollida, kas JWT on kehtiv.

Lisage järgmine kood auth.js mis määratleb vahevara funktsioonid, mis genereerivad ja kontrollivad JWT-sid.

konst jwt = nõuda('jsonwebtoken');
konst { SecretKey } = nõuda('./config');

konst generToken = (kasulik koormus) => {
konst token = jwt.sign (kasutav koormus, salajane võti, { aegub: '1h' });
tagasi märk ;
};

konst verifyToken = (req, res, next) => {
konst token = req.cookies.token;

kui (!märk) {
tagasi res.status(401).json({ sõnum: 'märki pole esitatud' });
}

jwt.verify (token, secretKey, (err, decoded) => {
kui (err) {
tagasi res.status(401).json({ sõnum: "Vigane tunnus" });
}

req.userId = dekodeeritud.kasutajaId;
next();
});
};

moodul.exports = {genereeridaToken, verifyToken};

The genereerida Token funktsioon genereerib JWT, allkirjastades kasuliku koormuse salajase võtmega ja määrates aegumisaja, kui verifyToken funktsioon toimib vahevarana, et kontrollida pakutud loa autentsust ja kehtivust.

Määrake API marsruudid

Loo uus routes/userRoutes.js faili juurkataloogis ja lisage järgmine kood.

konst väljendada = nõuda('väljendama');
konst ruuter = ekspress. Ruuter ();
konst userControllers = nõuda("../controllers/userControllers");
konst { verifyToken } = nõuda("../middleware/auth");
ruuter.post('/api/register', userControllers.registerUser);
ruuter.post('/api/login', userControllers.loginUser);
ruuter.get('/api/users', verifyToken, userControllers.getUsers);
moodul.exports = ruuter;

Värskendage oma serveri sisenemispunkti

Värskendage oma server.js faili järgmise koodiga.

konst väljendada = nõuda('väljendama');
konst cors = nõuda('kors');
konst rakendus = express();
konst port = 5000;
nõuda('dotenv').config();
konst connectDB = nõuda('./utils/db');
konst cookieParser = nõuda('cookie-parser');

connectDB();

app.use (express.json());
app.use (express.urlencoded({ pikendatud: tõsi }));
app.use (cors());
app.use (cookieParser());
konst userRoutes = nõuda('./routes/userRoutes');
app.use('/', userRoutes);

app.listen (port, () => {
konsool.log(`Server kuulab kell http://localhost:${port}`);
});

REST API testimiseks keerake arendusserver üles ja tehke API päringud määratletud lõpp-punktidele:

sõlme server.js

Node.js REST API-de turvamine

Node.js REST API-de turvamine läheb kaugemale lihtsalt JWT-de kasutamisest, kuigi neil on autentimisel ja autentimisel ülioluline roll autoriseerimisel on oluline oma taustaprogrammi kaitsmiseks kasutusele võtta terviklik turvalisuse lähenemisviis süsteemid. Lisaks JWT-dele peaksite kaaluma ka HTTPS-i rakendamist side krüptimiseks, sisendi valideerimiseks ja desinfitseerimiseks ning paljudeks muudeks.

Kombineerides mitu turvameedet, saate luua oma jaoks tugeva turberaamistiku Node.js REST API-d ja minimeerida volitamata juurdepääsu, andmetega seotud rikkumiste ja muu turvalisuse riski ähvardused.