A felhasználó hitelesítése és engedélyezése a JWT használatával a NodeJS-ben

A hitelesítés és engedélyezés a számítógépes biztonság alapfogalma. Hitelesítési adatait (például felhasználónevet és jelszót) használja személyazonosságának bizonyítására, regisztrált felhasználóként való azonosítására, majd további jogosultságok megszerzésére.

Ez akkor is érvényes, ha Facebook- vagy Google-fiókjával jelentkezik be az online szolgáltatásokba.

Ebben a cikkben egy Nodejs API-t fogunk felépíteni JWT (JSON Web Tokens) hitelesítéssel. Az alábbi eszközöket fogjuk használni ebben az oktatóanyagban:

  • Expressjs
  • MongoDB adatbázis
  • Indiai menyét
  • Dotenv
  • Bcryptjs
  • Jsonwebtoken

Hitelesítés vs. Engedélyezés

Mi az a hitelesítés?

A hitelesítés a felhasználók azonosításának folyamata olyan hitelesítő adatok megszerzésével, mint az e-mail, a jelszó és a tokenek. A megadott hitelesítő adatok összehasonlításra kerülnek a regisztrált felhasználó hitelesítő adataival, amelyek a helyi számítógépes rendszer fájljában vagy bármely adatbázisban elérhetők. Ha a megadott hitelesítő adatok megegyeznek az adatbázisban rendelkezésre álló adatokkal, akkor a hitelesítési folyamat befejeződik, és a felhasználó hozzáférhet az erőforrásokhoz.

Mi az engedélyezés?

Az engedélyezés a hitelesítés után történik. Minden engedélyezéshez hitelesítési eljárást kell kötni. Ez az a folyamat, amely lehetővé teszi a felhasználók számára, hogy hozzáférjenek az erőforrásokhoz a rendszerből vagy egy webhelyről. Ebben az oktatóanyagban a bejelentkezett felhasználók számára engedélyezzük a felhasználói adatokhoz való hozzáférést. Ha a felhasználó nincs bejelentkezve, nem férhet hozzá az adatokhoz.

Az engedélyezés legjobb példái a közösségi média platformok, például a Facebook és a Twitter. Fiók nélkül nem férhet hozzá a közösségi média tartalmaihoz.

Egy másik példa az engedélyezésre az előfizetésen alapuló tartalom, a hitelesítés megtörténhet a webhelyre történő bejelentkezéssel, de addig nem lesz jogosult a tartalom elérésére, amíg nem iratkozott fel.

Előfeltétel

Mielőtt továbblépne, feltételezem, hogy alapvető ismeretekkel rendelkezik a Javascript és a MongoDB használatáról, és jól ismeri a Nodejs-t.

Győződjön meg arról, hogy telepítette a csomópontot és az npm-et a helyi gépen. Annak ellenőrzéséhez, hogy a csomópont és az npm telepítve van-e a számítógépen, nyissa meg a parancssort, és írja be a node -v és npm -v parancsokat. Ennek a következő eredményt kell mutatnia.

A te verzióid eltérhetnek az enyémtől. Az NPM automatikusan letöltődik a csomóponttal együtt. Ha még nem töltötte le, töltse le a NodeJS webhely.

A kód írásához IDE (integrált fejlesztői környezet) szükséges. Ebben az oktatóanyagban a VS kódszerkesztőt használom. Ha van másik, azt is használhatod. Ha nincs IDE telepítve a számítógépére, letöltheti a webhelyről Visual Studio webhely. Töltse le a helyi rendszer alapján.

Projekt beállítása

Hozzon létre egy mappanév nodeapi bárhol a helyi számítógépen, majd nyissa meg a vs-code segítségével. Nyissa meg a vs-code terminált, majd gépeléssel inicializálja a csomóponti csomagkezelőt.

npm init -y

Győződjön meg arról, hogy a nodeapi könyvtárban van.

  Hogyan adhatunk automatikusan szerepeket a Discordban

A fenti parancs létrehoz egy package.json fájlt, amely tartalmazza az összes függőséget, amelyet ebben a projektben használni fogunk.

Most letöltjük az összes fent említett csomagot, most írja be és írja be őket a terminálba.

npm install express dotenv jsonwebtoken mongoose bcryptjs

Most már lesznek fájlok és mappák, amint az alább látható.

Szerver létrehozása és adatbázis csatlakoztatása

Most hozzon létre egy index.js nevű fájlt és egy config nevű mappát. A config-on belül hozzon létre két conn.js nevű fájlt az adatbázishoz való csatlakozáshoz és config.env nevű fájlt a környezeti változók deklarálásához. Írja be az alábbi kódot a megfelelő fájlba.

index.js

const express = require('express');
const dotenv = require('dotenv');

//Configure dotenv files above using any other library and files
dotenv.config({path:'./config/config.env'}); 

//Creating an app from express
const app = express();

//Using express.json to get request of json data
app.use(express.json());



//listening to the server
app.listen(process.env.PORT,()=>{
    console.log(`Server is listening at ${process.env.PORT}`);
})

Ha dotenv-t használ, akkor állítsa be az index.js fájlban, mielőtt másik, környezeti változókat használó fájlt hívna meg.

conn.js

const mongoose = require('mongoose');

mongoose.connect(process.env.URI, 
    { useNewUrlParser: true,
     useUnifiedTopology: true })
    .then((data) => {
        console.log(`Database connected to ${data.connection.host}`)
})

config.env

URI = 'mongodb+srv://ghulamrabbani883:[email protected]/?retryWrites=true&w=majority'
PORT = 5000

Én mongo-DB Atlas URI-t használok, használhatod a localhost-ot is.

Modellek és útvonalak készítése

A modell az adatok elrendezése a Mongo-DB adatbázisban, és JSON-dokumentumként kerül tárolásra. A modell létrehozásához a mongúz sémát fogjuk használni.

Az útválasztás arra utal, hogy az alkalmazás hogyan válaszol az ügyfél kéréseire. Útvonalak létrehozásához az expressz útválasztó funkciót fogjuk használni.

Az útválasztási módszerek általában két argumentumot használnak. Az első az útvonal, a második pedig a visszahívási funkció, amely meghatározza, hogy ez az útvonal mit tegyen az ügyfél kérésére.

Szükség esetén egy harmadik argumentumot is használ köztes szoftver funkcióként, például a hitelesítési folyamatban. Miközben hitelesített API-t építünk, a köztes szoftver funkciót is használjuk a felhasználók engedélyezésére és hitelesítésére.

Most két mappát fogunk létrehozni útvonalak és modellek néven. Az útvonalakon belül hozzon létre egy userRoute.js fájlnevet, a Modell mappában pedig egy userModel.js fájlnevet. A fájlok létrehozása után írja be a következő kódot a megfelelő fájlba.

userModel.js

const mongoose = require('mongoose');

//Creating Schema using mongoose
const userSchema = new mongoose.Schema({
    name: {
        type:String,
        required:true,
        minLength:[4,'Name should be minimum of 4 characters']
    },
    email:{
        type:String,
        required:true,
        unique:true,
    },
    password:{
        type:String,
        required:true,
        minLength:[8,'Password should be minimum of 8 characters']
    },
    token:{
        type:String
    }
})

//Creating models
const userModel = mongoose.model('user',userSchema);
module.exports = userModel;

userRoute.js

const express = require('express');
//Creating express router
const route = express.Router();
//Importing userModel
const userModel = require('../models/userModel');

//Creating register route
route.post('/register',(req,res)=>{

})
//Creating login routes
route.post('/login',(req,res)=>{

})

//Creating user routes to fetch users data
route.get('/user',(req,res)=>{

})

Útvonal-funkcionalitás megvalósítása és JWT tokenek létrehozása

Mi az a JWT?

A JSON web tokenek (JWT) egy JavaScript-könyvtár, amely tokeneket hoz létre és ellenőrzi. Ez egy nyílt szabvány, amelyet két fél – egy kliens és egy szerver – közötti információmegosztásra használnak. A JWT két funkcióját fogjuk használni. Az első funkció a jel új token létrehozásához, a második funkció az ellenőrzés a token ellenőrzéséhez.

  Hogyan frissítsünk Elementary OS Juno-ra

Mi az a bcryptjs?

A Bcryptjs egy Niels Provos és David Mazières által létrehozott kivonatoló függvény. Kivonatoló algoritmust használ a jelszó kivonatához. Két leggyakoribb funkciója van, amelyeket ebben a projektben fogunk használni. Az első bcryptjs függvény a hash a hash érték generálására, a második funkció pedig a jelszavak összehasonlítása.

Az útvonal funkcióinak megvalósítása

A visszahívási függvény az útválasztásban három argumentumot vesz fel: kérés, válasz és következő függvény. A következő argumentum nem kötelező; csak akkor adja át, ha szüksége van rá. Ezeknek az érveknek a kérésben, válaszban és a következő sorrendben kell szerepelniük. Most módosítsa a userRoute.js, config.env és index.js fájlokat a következő kódokkal.

userRoute.js

//Requiring all the necessary files and libraries
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

//Creating express router
const route = express.Router();
//Importing userModel
const userModel = require('../models/userModel');

//Creating register route
route.post("/register", async (req, res) => {

    try {
        const { name, email, password } = req.body;
        //Check emptyness of the incoming data
        if (!name || !email || !password) {
            return res.json({ message: 'Please enter all the details' })
        }

        //Check if the user already exist or not
        const userExist = await userModel.findOne({ email: req.body.email });
        if (userExist) {
            return res.json({ message: 'User already exist with the given emailId' })
        }
        //Hash the password
        const salt = await bcrypt.genSalt(10);
        const hashPassword = await bcrypt.hash(req.body.password, salt);
        req.body.password = hashPassword;
        const user = new userModel(req.body);
        await user.save();
        const token = await jwt.sign({ id: user._id }, process.env.SECRET_KEY, {
            expiresIn: process.env.JWT_EXPIRE,
        });
        return res.cookie({ 'token': token }).json({ success: true, message: 'User registered successfully', data: user })
    } catch (error) {
        return res.json({ error: error });
    }

})
//Creating login routes
route.post('/login', async (req, res) => {
    try {
        const { email, password } = req.body;
        //Check emptyness of the incoming data
        if (!email || !password) {
            return res.json({ message: 'Please enter all the details' })
        }
        //Check if the user already exist or not
        const userExist = await userModel.findOne({email:req.body.email});
        if(!userExist){
            return res.json({message:'Wrong credentials'})
        }
        //Check password match
        const isPasswordMatched = await bcrypt.compare(password,userExist.password);
        if(!isPasswordMatched){
            return res.json({message:'Wrong credentials pass'});
        }
        const token = await jwt.sign({ id: userExist._id }, process.env.SECRET_KEY, {
            expiresIn: process.env.JWT_EXPIRE,
        });
        return res.cookie({"token":token}).json({success:true,message:'LoggedIn Successfully'})
    } catch (error) {
        return res.json({ error: error });
    }

})

//Creating user routes to fetch users data
route.get('/user', async (req, res) => {
    try {
        const user  = await userModel.find();
        if(!user){
            return res.json({message:'No user found'})
        }
        return res.json({user:user})
    } catch (error) {
        return res.json({ error: error });  
    }
})

module.exports = route;

Ha Async funkciót használ, használja a try-catch blokkot, ellenkező esetben kezeletlen ígéret-elutasítási hibát dob.

config.env

URI = 'mongodb+srv://ghulamrabbani883:[email protected]/?retryWrites=true&w=majority'
PORT = 5000
SECRET_KEY = KGGK>HKHVHJVKBKJKJBKBKHKBMKHB
JWT_EXPIRE = 2d

index.js

const express = require('express');
const dotenv = require('dotenv');

//Configure dotenv files above using any other library and files
dotenv.config({path:'./config/config.env'}); 
require('./config/conn');
//Creating an app from express
const app = express();
const route = require('./routes/userRoute');

//Using express.json to get request of json data
app.use(express.json());
//Using routes

app.use('/api', route);

//listening to the server
app.listen(process.env.PORT,()=>{
    console.log(`Server is listening at ${process.env.PORT}`);
})

Köztes szoftver létrehozása a felhasználó hitelesítéséhez

Mi az a köztes szoftver?

A köztes szoftver egy olyan funkció, amely hozzáfér a kéréshez, a válaszobjektumhoz és a következő függvényhez a kérés-válasz ciklusban. A következő függvény a függvény végrehajtása után kerül meghívásra. Ahogy fentebb említettem, használja a next()-t, ha másik visszahívási funkciót vagy köztes szoftver függvényt kell végrehajtania.

  11 legjobb adatmentési megoldás közepes és nagyvállalati vállalkozások számára

Most hozzon létre egy middleware nevű mappát, és azon belül hozzon létre fájlnevet auth.js néven, és írja be a következő kódot.

auth.js

const userModel = require('../models/userModel');
const jwt = require('jsonwebtoken');
const isAuthenticated = async (req,res,next)=>{
    try {
        const {token} = req.cookies;
        if(!token){
            return next('Please login to access the data');
        }
        const verify = await jwt.verify(token,process.env.SECRET_KEY);
        req.user = await userModel.findById(verify.id);
        next();
    } catch (error) {
       return next(error); 
    }
}

module.exports = isAuthenticated;

Most telepítse a cookie-elemző könyvtárat a cookieParser konfigurálásához az alkalmazásban. A cookieParser segít a cookie-ban tárolt token elérésében. Ha nincs beállítva a cookieParser a nodejs alkalmazásban, akkor nem fog tudni hozzáférni a cookie-khoz a kérelem objektum fejlécéből. Most írja be a terminálba a cookie-elemző letöltéséhez.

npm i cookie-parser

Most telepítve van egy cookieParser. Konfigurálja az alkalmazást az index.js fájl módosításával, és adjon hozzá köztes szoftvert a „/user/” útvonalhoz.

index.js fájl

const cookieParser = require('cookie-parser');
const express = require('express');
const dotenv = require('dotenv');

//Configure dotenv files above using any other library and files
dotenv.config({path:'./config/config.env'}); 
require('./config/conn');
//Creating an app from express
const app = express();
const route = require('./routes/userRoute');

//Using express.json to get request of json data
app.use(express.json());
//Configuring cookie-parser
app.use(cookieParser()); 

//Using routes
app.use('/api', route);

//listening to the server
app.listen(process.env.PORT,()=>{
    console.log(`Server is listening at ${process.env.PORT}`);
})

userRoute.js

//Requiring all the necessary files and libraries
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const isAuthenticated = require('../middleware/auth');

//Creating express router
const route = express.Router();
//Importing userModel
const userModel = require('../models/userModel');

//Creating user routes to fetch users data
route.get('/user', isAuthenticated, async (req, res) => {
    try {
        const user = await userModel.find();
        if (!user) {
            return res.json({ message: 'No user found' })
        }
        return res.json({ user: user })
    } catch (error) {
        return res.json({ error: error });
    }
})

module.exports = route;

A „/user” útvonal csak akkor érhető el, ha a felhasználó be van jelentkezve.

Az API-k ellenőrzése a POSTMAN-on

Az API-k ellenőrzése előtt módosítania kell a package.json fájlt. Adja hozzá a következő kódsorokat.

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "start": "node index.js",
    "dev": "nodemon index.js"
  },

A kiszolgálót az npm start beírásával indíthatja el, de csak egyszer fog futni. Ahhoz, hogy a kiszolgáló továbbra is működjön a fájlok módosítása közben, nodemonra lesz szüksége. Töltse le a terminálba gépelve

npm install -g nodemon

A -g jelző globálisan letölti a csomópontot a helyi rendszerre. Nem kell újra és újra letöltenie minden új projekthez.

A szerver futtatásához írja be az npm run dev parancsot a terminálba. A következő eredményt kapja.

Végül a kód elkészült, és a szerver megfelelően fut, menjen a postáshoz, és ellenőrizze, hogy működik-e.

Mi az a POSTÁS?

A POSTMAN egy szoftvereszköz az API tervezésére, építésére, fejlesztésére és tesztelésére.

Ha még nem töltötte le a postást a számítógépére, töltse le a postás weboldal.

Most nyissa meg a postást, és hozzon létre egy gyűjteménynevet nodeAPItest, és hozzon létre benne három kérést: regisztráció, bejelentkezés és felhasználó. A következő fájlokkal kell rendelkeznie.

Amikor JSON-adatokat küld a „localhost:5000/api/register” címre, a következő eredményt kapja.

Mivel a regisztráció során is készítünk és mentünk tokeneket a cookie-kba, a „localhost:5000/api/user” útvonal kérésekor megkaphatja a felhasználói adatokat. A többi kérést a POSTMAN-on ellenőrizheti.

Ha a teljes kódot szeretné megkapni, az enyémtől szerezheti be github fiók.

Következtetés

Ebben az oktatóanyagban megtanultuk, hogyan kell hitelesítést alkalmazni a NodeJS API-ra JWT tokenek használatával. Felhatalmaztuk a felhasználókat a felhasználói adatokhoz való hozzáférésre is.

BOLDOG KÓDOLÁST!