Како аутентификовати и овластити корисника користећи ЈВТ у НодеЈС-у

Аутентификација и ауторизација је основни концепт рачунарске безбедности. Користите своје акредитиве (као што су корисничко име и лозинка) да бисте доказали свој идентитет и идентификовали се као регистровани корисник, а затим добили додатне привилегије.

Ово важи и када се пријавите на услуге на мрежи користећи своје Фацебоок или Гоогле налоге.

У овом чланку ћемо направити Нодејс АПИ са ЈВТ (ЈСОН веб токени) аутентификацијом. Алати које ћемо користити у овом водичу су:

  • Екпрессјс
  • МонгоДБ база података
  • Мунгос
  • Дотенв
  • Бцриптјс
  • Јсонвебтокен

Аутхентицатион Вс. Овлашћење

Шта је аутентификација?

Аутентификација је процес идентификације корисника стицањем акредитива попут е-поште, лозинке и токена. Дати акредитиви се упоређују са акредитивима регистрованог корисника, који су доступни у датотеци локалног рачунарског система или било којој бази података. Ако се дати акредитиви поклапају са доступним подацима у бази података, процес аутентификације је завршен и кориснику је дозвољен приступ ресурсима.

Шта је овлашћење?

Ауторизација се дешава након аутентификације. Свака ауторизација мора имати процес аутентификације. То је процес омогућавања корисницима да приступе ресурсима са система или веб странице. У овом водичу ћемо овластити пријављене кориснике да приступе подацима корисника. Ако корисник није пријављен, неће моћи да користи приступ подацима.

Најбољи примери ауторизације су платформе друштвених медија попут Фејсбука и Твитера. Не можете приступити садржају друштвених медија без налога.

Други пример ауторизације је садржај заснован на претплати, ваша аутентификација се може извршити пријавом на веб локацију, али нећете бити овлашћени да приступите садржају док се не претплатите.

Предуслов

Пре него што кренете напред, претпостављам да имате основно разумевање Јавасцрипт-а и МонгоДБ-а и добро познавање Нодејс-а.

Уверите се да сте инсталирали ноде и нпм на вашој локалној машини. Да бисте проверили да ли су ноде и нпм инсталирани на вашем рачунару, отворите командну линију и откуцајте ноде -в и нпм -в. Ово би требало да покаже следећи резултат.

Ваше верзије се могу разликовати од моје. НПМ се аутоматски преузима са чвором. Ако га још нисте преузели, преузмите га са Веб локација НодеЈС.

Биће вам потребан ИДЕ (Интегрисано развојно окружење) за писање кода. У овом водичу користим ВС едитор кода. Ако имате још један, можете га користити и. Ако немате инсталиран никакав ИДЕ на свом рачунару, можете га преузети са Веб страница Висуал Студио. Преузмите га на основу вашег локалног система.

Подешавање пројекта

Направите име фасцикле нодеапи било где на локалном рачунару, а затим је отворите помоћу вс-цоде-а. Отворите вс-цоде терминал, а затим иницијализујте менаџер пакета чвора куцањем.

npm init -y

Уверите се да сте у нодеапи директоријуму.

  Е-пошта вашег извршног директора?: Објашњена превара са пхисхинг-ом

Горња команда ће креирати датотеку пацкаге.јсон која садржи све зависности које ћемо користити у овом пројекту.

Сада ћемо преузети све горе поменуте пакете, сада их откуцајте и унесите у терминал.

npm install express dotenv jsonwebtoken mongoose bcryptjs

Сада ћете имати датотеке и фасцикле, као што је приказано испод.

Креирање сервера и повезивање базе података

Сада креирајте датотеку под називом индек.јс и фасциклу под називом цонфиг. Унутар конфигурације направите две датотеке под називом цонн.јс да бисте се повезали са базом података и цонфиг.енв да бисте прогласили променљиве окружења. Упишите дати код испод у одговарајуће датотеке.

индек.јс

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}`);
})

Ако користите дотенв, конфигуришите га у датотеци индек.јс пре него што позовете друге датотеке које користе променљиве окружења.

цонн.јс

const mongoose = require('mongoose');

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

цонфиг.енв

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

Користим монго-ДБ Атлас УРИ, можете користити и лоцалхост.

Креирање модела и рута

Модел је распоред ваших података у бази података Монго-ДБ и биће сачуван као ЈСОН документ. Да бисмо креирали модел, користићемо шему мунгоса.

Рутирање се односи на то како апликација одговара на захтеве клијената. Користићемо функцију експресног рутера за креирање рута.

Методе рутирања обично узимају два аргумента. Прва је рута, а друга је функција повратног позива која дефинише шта ће ова рута радити на захтев клијента.

Такође узима трећи аргумент као међуверску функцију када је то потребно, као у процесу аутентификације. Пошто правимо АПИ са аутентификацијом, такође ћемо користити функцију међувера за ауторизацију и аутентификацију корисника.

Сада ћемо креирати две фасцикле под називом руте и модели. Унутар рута креирајте име датотеке усерРоуте.јс и унутар директоријума модела креирајте име датотеке усерМодел.јс. Након креирања датотека, упишите следећи код у одговарајуће датотеке.

усерМодел.јс

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;

усерРоуте.јс

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)=>{

})

Имплементација функционалности руте и креирање ЈВТ токена

Шта је ЈВТ?

ЈСОН веб токени (ЈВТ) је јавасцрипт библиотека која креира и верификује токене. То је отворени стандард који се користи за дељење информација између две стране – клијента и сервера. Користићемо две функције ЈВТ-а. Прва функција је знак за креирање новог токена, а друга функција је верифи за верификацију токена.

  6 савета за коришћење иПхоне-а ноћу или у мраку

Шта је бцриптјс?

Бцриптјс је хеш функција коју су креирали Ниелс Провос и Давид Мазиерес. Користи хеш алгоритам за хеширање лозинке. Има две најчешће функције које ћемо користити у овом пројекту. Прва функција бцриптјс је хеш за генерисање хеш вредности, а друга функција је функција за упоређивање за упоређивање лозинки.

Имплементирајте функционалност руте

Функција повратног позива у рутирању узима три аргумента, захтев, одговор и следећу функцију. Следећи аргумент је опциони; пренесите ово само када вам је ово потребно. Ови аргументи треба да буду у захтеву, одговору и следећем редоследу. Сада измените датотеке усерРоуте.јс, цонфиг.енв и индек.јс следећим кодовима.

усерРоуте.јс

//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;

Ако користите Асинц функцију, користите блок три-цатцх, иначе ће изазвати необрађену грешку одбијања обећања.

цонфиг.енв

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

индек.јс

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}`);
})

Креирање међувера за аутентификацију корисника

Шта је средњи софтвер?

Средњи софтвер је функција која има приступ захтеву, објекту одговора и следећој функцији у циклусу захтев-одговор. Следећа функција се позива када је извршење функције завршено. Као што сам већ поменуо, користите нект() када морате да извршите другу функцију повратног позива или функцију међувера.

  СКЛ окидачи: Основни водич

Сада креирајте фасциклу под називом Миддлеваре, и унутар ње, креирајте име датотеке као аутх.јс и напишите следећи код.

аутх.јс

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;

Сада инсталирајте библиотеку анализатора колачића да бисте конфигурисали цоокиеПарсер у својој апликацији. цоокиеПарсер вам помаже да приступите токену ускладиштеном у колачићу. Ако немате конфигурисан цоокиеПарсер у вашој нодејс апликацији, нећете моћи да приступите колачићима из заглавља објекта захтева. Сада напишите у терминалу да преузмете колачић-парсер.

npm i cookie-parser

Сада имате инсталиран цоокиеПарсер. Конфигуришите своју апликацију тако што ћете модификовати датотеку индек.јс и додати међуверски софтвер на „/усер/“ руту.

индек.јс фајл

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}`);
})

усерРоуте.јс

//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;

Рута „/усер“ је доступна само када је корисник пријављен.

Провера АПИ-ја на ПОСТМАН-у

Пре него што проверите АПИ-је, потребно је да измените датотеку пацкаге.јсон. Додајте следеће линије кода.

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

Можете покренути сервер тако што ћете укуцати нпм старт, али ће се покренути само једном. Да би ваш сервер радио док мењате датотеке, биће вам потребан нодемон. Преузмите га тако што ћете укуцати у терминал

npm install -g nodemon

-г заставица ће преузети нодемон глобално на ваш локални систем. Не морате да га преузимате изнова и изнова за сваки нови пројекат.

Да бисте покренули сервер, унесите нпм рун дев у терминал. Добићете следећи резултат.

Коначно, ваш код је завршен и сервер ради исправно, идите до поштара и проверите да ли ради.

Шта је ПОШТАР?

ПОСТМАН је софтверски алат за дизајнирање, изградњу, развој и тестирање АПИ-ја.

Ако нисте преузели поштара на свој рачунар, преузмите га са сајт поштара.

Сада отворите поштара и креирајте назив колекције нодеАПИтест, а унутар њега креирајте три захтева: регистрација, пријава и корисник. Требало би да имате следеће датотеке.

Када пошаљете ЈСОН податке на „лоцалхост:5000/апи/регистер“, добићете следећи резултат.

Пошто креирамо и чувамо токене у колачићима и током регистрације, можете имати податке о кориснику када затражите руту „лоцалхост:5000/апи/усер“. Остале захтеве можете проверити на ПОШТАРУ.

Ако желите комплетан код, можете га добити од мог гитхуб налог.

Закључак

У овом водичу смо научили како да применимо аутентификацију на НодеЈС АПИ користећи ЈВТ токене. Такође смо овластили кориснике за приступ корисничким подацима.

СРЕЋНО КОДИРАЊЕ!